ZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQppbmRleCBkODU3YmEzLi4xNTJiZTIwIDEwMDY0NAotLS0gYS9OT1RJQ0UKKysrIGIvTk9USUNFCkBAIC03Miw2ICs3MiwxNiBAQAogT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQ7IG5vdCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIEFkZGl0aW9uYWwgQ29kZWNzIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQWRkaXRpb25hbCBDb2RlY3MKK1RoZXNlIGZpbGVzIGFyZSBDb3B5cmlnaHQgMjAwMy0yMDEwIFZpc3VhbE9uLCBidXQgcmVsZWFzZWQgdW5kZXIKK3RoZSBBcGFjaGUyIExpY2Vuc2UuCisKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICA9PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VjdGlvbiA0IGQgb2YgICAgICAgICAgICAgICAgICAgID09CiAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBiMDg3YzIwLi5iZjE4ZjZhIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0xMTg0NTYsNiArMTE4NDU2LDM2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPG1ldGhvZCBuYW1lPSJkaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZUZvcmVncm91bmREaXNwYXRjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldERlZmF1bHRBZGFwdGVyIgogIHJldHVybj0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMTg0OTEsNiArMTE4NTIxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX05ERUZfRElTQ09WRVJFRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLm5mYy5hY3Rpb24uTkRFRl9ESVNDT1ZFUkVEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFDVElPTl9UQUdfRElTQ09WRVJFRCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMTg1MDIsNiArMTE4NTQzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fVEVDSE5PTE9HWV9ESVNDT1ZFUkVEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQubmZjLmFjdGlvbi5URUNIX0RJU0NPVkVSRUQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRVhUUkFfSUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTE4NTI0LDYgKzExODU3NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfVEFHIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQubmZjLmV4dHJhLlRBRyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTmZjTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTE4NTQ1LDYgKzExODYwOCwxNDA2IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iVGFnIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZU1vY2tUYWciCisgcmV0dXJuPSJhbmRyb2lkLm5mYy5UYWciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGVjaExpc3QiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0ZWNoTGlzdEV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGVbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRlY2hub2xvZ3kiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy50ZWNobm9sb2d5LlRhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQubmZjLk5mY0FkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRlY2giIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZWNobm9sb2d5TGlzdCIKKyByZXR1cm49ImludFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPC9wYWNrYWdlPgorPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5uZmMudGVjaG5vbG9neSIKKz4KKzxjbGFzcyBuYW1lPSJCYXNpY1RhZ1RlY2hub2xvZ3kiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSIiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm5mYy50ZWNobm9sb2d5LlRhZ1RlY2hub2xvZ3kiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJjaGVja0Nvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbm5lY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYWciCisgcmV0dXJuPSJhbmRyb2lkLm5mYy5UYWciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGVjaG5vbG9neUlkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ29ubmVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWNvbm5lY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2NlaXZlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Iklzb0RlcCIKKyBleHRlbmRzPSJhbmRyb2lkLm5mYy50ZWNobm9sb2d5LkJhc2ljVGFnVGVjaG5vbG9neSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iSXNvRGVwIgorIHR5cGU9ImFuZHJvaWQubmZjLnRlY2hub2xvZ3kuSXNvRGVwIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRIaUxheWVyUmVzcG9uc2UiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGlzdG9yaWNhbEJ5dGVzIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik1pZmFyZUNsYXNzaWMiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik1pZmFyZUNsYXNzaWMiCisgdHlwZT0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5NaWZhcmVDbGFzc2ljIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhdXRoZW50aWNhdGVCbG9jayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJrZXlBIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImF1dGhlbnRpY2F0ZVNlY3RvciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlY3RvciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5QSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZWNyZW1lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJibG9jayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCbG9ja0NvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWN0b3JDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWN0b3JTaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRvdGFsQmxvY2tDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluY3JlbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRW11bGF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRCbG9jayIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VjdG9yIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRCbG9jayIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmxvY2siIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVzdG9yZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyYW5zZmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmxvY2siIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVCbG9jayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVCbG9jayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlY3RvciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJibG9jayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iS0VZX0RFRkFVTFQiCisgdHlwZT0iYnl0ZVtdIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSJudWxsIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWV9NSUZBUkVfQVBQTElDQVRJT05fRElSRUNUT1JZIgorIHR5cGU9ImJ5dGVbXSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlfTkZDX0ZPUlVNIgorIHR5cGU9ImJ5dGVbXSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSVpFXzFLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSVpFXzJLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjA0OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSVpFXzRLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSVpFX01JTkkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzMjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0laRV9VTktOT1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX0NMQVNTSUMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfREVTRklSRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9QTFVTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1BSTyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9VTFRSQUxJR0hUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1VOS05PV04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNaWZhcmVVbHRyYWxpZ2h0IgorIGV4dGVuZHM9ImFuZHJvaWQubmZjLnRlY2hub2xvZ3kuQmFzaWNUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNaWZhcmVVbHRyYWxpZ2h0IgorIHR5cGU9ImFuZHJvaWQubmZjLnRlY2hub2xvZ3kuTWlmYXJlVWx0cmFsaWdodCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQubmZjLk5mY0FkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iYW5kcm9pZC5uZmMuVGFnIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleHRyYXMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWFkQmxvY2siCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRPVFAiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlQmxvY2siCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJibG9jayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlUGFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1VMVFJBTElHSFQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfVUxUUkFMSUdIVF9DIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1VOS05PV04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTmRlZiIKKyBleHRlbmRzPSJhbmRyb2lkLm5mYy50ZWNobm9sb2d5LkJhc2ljVGFnVGVjaG5vbG9neSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImNhbk1ha2VSZWFkb25seSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2FjaGVkTmRlZk1lc3NhZ2UiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHRyYU5kZWZNZXNzYWdlIgorIHJldHVybj0iYW5kcm9pZC5uZmMuTmRlZk1lc3NhZ2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iRm9ybWF0RXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm5mYy5Gb3JtYXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1heFNpemUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmRlZk1lc3NhZ2UiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iRm9ybWF0RXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm5mYy5Gb3JtYXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNXcml0YWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibWFrZVJlYWRvbmx5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVFeHRyYU5kZWZNZXNzYWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtc2ciIHR5cGU9ImFuZHJvaWQubmZjLk5kZWZNZXNzYWdlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGb3JtYXRFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQubmZjLkZvcm1hdEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVOZGVmTWVzc2FnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1zZyIgdHlwZT0iYW5kcm9pZC5uZmMuTmRlZk1lc3NhZ2UiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZvcm1hdEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5uZmMuRm9ybWF0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Ik1JRkFSRV9DTEFTU0lDIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTA1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5GQ19GT1JVTV9UWVBFXzEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5GQ19GT1JVTV9UWVBFXzIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5GQ19GT1JVTV9UWVBFXzMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5GQ19GT1JVTV9UWVBFXzQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9USEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5kZWZGb3JtYXRhYmxlIgorIGV4dGVuZHM9ImFuZHJvaWQubmZjLnRlY2hub2xvZ3kuQmFzaWNUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZm9ybWF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlyc3RNZXNzYWdlIiB0eXBlPSJhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRm9ybWF0RXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm5mYy5Gb3JtYXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5mY0EiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik5mY0EiCisgdHlwZT0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5OZmNBIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRBdHFhIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNhayIKKyByZXR1cm49InNob3J0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5mY0IiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik5mY0IiCisgdHlwZT0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5OZmNCIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRBcHBsaWNhdGlvbkRhdGEiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvdG9jb2xJbmZvIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5mY0YiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik5mY0YiCisgdHlwZT0iYW5kcm9pZC5uZmMudGVjaG5vbG9neS5OZmNGIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRNYW51ZmFjdHVyZXIiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3lzdGVtQ29kZSIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJOZmNWIgorIGV4dGVuZHM9ImFuZHJvaWQubmZjLnRlY2hub2xvZ3kuQmFzaWNUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJOZmNWIgorIHR5cGU9ImFuZHJvaWQubmZjLnRlY2hub2xvZ3kuTmZjViIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQubmZjLk5mY0FkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iYW5kcm9pZC5uZmMuVGFnIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleHRyYXMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RHNmSWQiCisgcmV0dXJuPSJieXRlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlc3BvbnNlRmxhZ3MiCisgcmV0dXJuPSJieXRlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29ubmVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iYW5kcm9pZC5uZmMuVGFnIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGVjaG5vbG9neUlkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVjb25uZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklTT19ERVAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JRkFSRV9DTEFTU0lDIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSUZBUkVfVUxUUkFMSUdIVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkRFRiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkRFRl9GT1JNQVRBQkxFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJORkNfQSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkZDX0IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5GQ19GIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJORkNfViIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQub3BlbmdsIgogPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCBlYzJmNzcxLi42ZjBjYjQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtNjU0LDcgKzY1NCw3IEBACiAgICAgYm9vbGVhbiBtQ2FsbGVkOwogICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOwogICAgIGJvb2xlYW4gbUxvYWRlcnNTdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzdW1lZDsKKyAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1SZXN1bWVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZDsKICAgICBib29sZWFuIG1GaW5pc2hlZDsKICAgICBib29sZWFuIG1TdGFydGVkQWN0aXZpdHk7CkBAIC00MzM1LDkgKzQzMzUsOCBAQAogICAgICAgICAKICAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgCi0gICAgICAgIC8vIEZpcnN0IGNhbGwgb25SZXN1bWUoKSAtYmVmb3JlLSBzZXR0aW5nIG1SZXN1bWVkLCBzbyB3ZSBkb24ndAotICAgICAgICAvLyBzZW5kIG91dCBhbnkgc3RhdHVzIGJhciAvIG1lbnUgbm90aWZpY2F0aW9ucyB0aGUgY2xpZW50IG1ha2VzLgogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIC8vIG1SZXN1bWVkIGlzIHNldCBieSB0aGUgaW5zdHJ1bWVudGF0aW9uCiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25SZXN1bWUodGhpcyk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKApAQCAtNDM0Niw3ICs0MzQ1LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIE5vdyByZWFsbHkgcmVzdW1lLCBhbmQgaW5zdGFsbCB0aGUgY3VycmVudCBzdGF0dXMgYmFyIGFuZCBtZW51LgotICAgICAgICBtUmVzdW1lZCA9IHRydWU7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgCiAgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hSZXN1bWUoKTsKQEAgLTQzNzAsNiArNDM2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgbUNvbXBvbmVudC50b1Nob3J0U3RyaW5nKCkgKwogICAgICAgICAgICAgICAgICAgICAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUGF1c2UoKSIpOwogICAgICAgICB9CisgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVVzZXJMZWF2aW5nKCkgewpAQCAtNDQxNyw3ICs0NDE2LDYgQEAKICAgICAKICAgICAgICAgICAgIG1TdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybURlc3Ryb3koKSB7CkBAIC00NDI5LDcgKzQ0MjcsMTAgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICBmaW5hbCBib29sZWFuIGlzUmVzdW1lZCgpIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUmVzdW1lZCgpIHsKICAgICAgICAgcmV0dXJuIG1SZXN1bWVkOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCBkYjA0NmVmLi4wNGQwZmRkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtMTkzLDYgKzE5Myw5IEBACiAgICAgZmluYWwgSGFzaE1hcDxJQmluZGVyLCBQcm92aWRlckNsaWVudFJlY29yZD4gbUxvY2FsUHJvdmlkZXJzCiAgICAgICAgID0gbmV3IEhhc2hNYXA8SUJpbmRlciwgUHJvdmlkZXJDbGllbnRSZWNvcmQ+KCk7CiAKKyAgICBmaW5hbCBIYXNoTWFwPEFjdGl2aXR5LCBBcnJheUxpc3Q8T25BY3Rpdml0eVBhdXNlZExpc3RlbmVyPj4gbU9uUGF1c2VMaXN0ZW5lcnMKKyAgICAgICAgPSBuZXcgSGFzaE1hcDxBY3Rpdml0eSwgQXJyYXlMaXN0PE9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcj4+KCk7CisKICAgICBmaW5hbCBHY0lkbGVyIG1HY0lkbGVyID0gbmV3IEdjSWRsZXIoKTsKICAgICBib29sZWFuIG1HY0lkbGVyU2NoZWR1bGVkID0gZmFsc2U7CiAKQEAgLTE1MDUsNiArMTUwOCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIoQWN0aXZpdHkgYWN0aXZpdHksCisgICAgICAgICAgICBPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtT25QYXVzZUxpc3RlbmVycykgeworICAgICAgICAgICAgQXJyYXlMaXN0PE9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcj4gbGlzdCA9IG1PblBhdXNlTGlzdGVuZXJzLmdldChhY3Rpdml0eSk7CisgICAgICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8T25BY3Rpdml0eVBhdXNlZExpc3RlbmVyPigpOworICAgICAgICAgICAgICAgIG1PblBhdXNlTGlzdGVuZXJzLnB1dChhY3Rpdml0eSwgbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0LmFkZChsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHlJbmZvIHJlc29sdmVBY3Rpdml0eUluZm8oSW50ZW50IGludGVudCkgewogICAgICAgICBBY3Rpdml0eUluZm8gYUluZm8gPSBpbnRlbnQucmVzb2x2ZUFjdGl2aXR5SW5mbygKICAgICAgICAgICAgICAgICBtSW5pdGlhbEFwcGxpY2F0aW9uLmdldFBhY2thZ2VNYW5hZ2VyKCksIFBhY2thZ2VNYW5hZ2VyLkdFVF9TSEFSRURfTElCUkFSWV9GSUxFUyk7CkBAIC0yNDQyLDYgKzI0NTcsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByLnBhdXNlZCA9IHRydWU7CisKKyAgICAgICAgLy8gTm90aWZ5IGFueSBvdXRzdGFuZGluZyBvbiBwYXVzZWQgbGlzdGVuZXJzCisgICAgICAgIEFycmF5TGlzdDxPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXI+IGxpc3RlbmVyczsKKyAgICAgICAgc3luY2hyb25pemVkIChtT25QYXVzZUxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzID0gbU9uUGF1c2VMaXN0ZW5lcnMucmVtb3ZlKHIuYWN0aXZpdHkpOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gKGxpc3RlbmVycyAhPSBudWxsID8gbGlzdGVuZXJzLnNpemUoKSA6IDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbGlzdGVuZXJzLmdldChpKS5vblBhdXNlZChyLmFjdGl2aXR5KTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQppbmRleCBhZDgxMWQ4Li5jZDI3OGJlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCkBAIC0xMTQ5LDYgKzExNDksNyBAQAogICAgICAqIEBwYXJhbSBhY3Rpdml0eSBUaGUgYWN0aXZpdHkgYmVpbmcgcmVzdW1lZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjYWxsQWN0aXZpdHlPblJlc3VtZShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBhY3Rpdml0eS5tUmVzdW1lZCA9IHRydWU7CiAgICAgICAgIGFjdGl2aXR5Lm9uUmVzdW1lKCk7CiAgICAgICAgIAogICAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL09uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL09uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWYxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvT25BY3Rpdml0eVBhdXNlZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICoJICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBIGxpc3RlbmVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYW4gQWN0aXZpdHkgaXMgcGF1c2VkLiBTaW5jZSB0aGlzIGlzIHRyYWNrZWQgY2xpZW50IHNpZGUKKyAqIGl0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB0byByZXByZXNlbnQgdGhlIGV4YWN0IGN1cnJlbnQgc3RhdGUsIGJ1dCBjYW4gYmUgdXNlZCBhcyBhIGhpbnQKKyAqIGZvciBjbGVhbnVwLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT25BY3Rpdml0eVBhdXNlZExpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZ2l2ZW4gYWN0aXZpdHkgaXMgcGF1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUGF1c2VkKEFjdGl2aXR5IGFjdGl2aXR5KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IGRhNTE4YzIuLjJkMDNlN2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQpAQCAtMTU3OSw5ICsxNTc5LDExIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgQ2xvc2VHdWFyZCBzdXBwb3J0LgogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZighbUNsb3NlRmxhZykgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIudGhpcy5yZWxlYXNlUHJvdmlkZXIobUNvbnRlbnRQcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkN1cnNvciBmaW5hbGl6ZWQgd2l0aG91dCBwcmlvciBjbG9zZSgpIik7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvSU5mY0FkYXB0ZXIuYWlkbAppbmRleCBhNjYzZmI4Li5jYjlmYzlkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvSU5mY0FkYXB0ZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvSU5mY0FkYXB0ZXIuYWlkbApAQCAtMTYsNiArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmZjOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQubmZjLk5kZWZNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKIGltcG9ydCBhbmRyb2lkLm5mYy5JTGxjcFNvY2tldDsKQEAgLTQ0LDYgKzQ3LDkgQEAKICAgICBOZGVmTWVzc2FnZSBsb2NhbEdldCgpOwogICAgIHZvaWQgbG9jYWxTZXQoaW4gTmRlZk1lc3NhZ2UgbWVzc2FnZSk7CiAgICAgdm9pZCBvcGVuVGFnQ29ubmVjdGlvbihpbiBUYWcgdGFnKTsKKyAgICB2b2lkIGVuYWJsZUZvcmVncm91bmREaXNwYXRjaChpbiBDb21wb25lbnROYW1lIGFjdGl2aXR5LCBpbiBQZW5kaW5nSW50ZW50IGludGVudCwKKyAgICAgICAgaW4gSW50ZW50RmlsdGVyW10gZmlsdGVycyk7CisgICAgdm9pZCBkaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoKGluIENvbXBvbmVudE5hbWUgYWN0aXZpdHkpOwogCiAgICAgLy8gTm9uLXB1YmxpYyBtZXRob2RzCiAgICAgLy8gVE9ETzogY2hlY2sgYW5kIGNvbXBsZXRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvTmZjQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL05mY0FkYXB0ZXIuamF2YQppbmRleCA3NThjOGEwLi42MmI3NWQwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvTmZjQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZmNBZGFwdGVyLmphdmEKQEAgLTE4LDggKzE4LDEyIEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5PbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKQEAgLTQzLDcgKzQ3LDYgQEAKICAgICAgKgogICAgICAqIElmIGFueSBhY3Rpdml0aWVzIHJlc3BvbmQgdG8gdGhpcyBpbnRlbnQgbmVpdGhlcgogICAgICAqIHtAbGluayAjQUNUSU9OX1RFQ0hOT0xPR1lfRElTQ09WRVJFRH0gb3Ige0BsaW5rICNBQ1RJT05fVEFHX0RJU0NPVkVSRUR9IHdpbGwgYmUgc3RhcnRlZC4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkRFRl9ESVNDT1ZFUkVEID0gImFuZHJvaWQubmZjLmFjdGlvbi5OREVGX0RJU0NPVkVSRUQiOwpAQCAtNTcsNyArNjAsNiBAQAogICAgICAqIHtAbGluayAjQUNUSU9OX1RBR19ESVNDT1ZFUkVEfQogICAgICAqCiAgICAgICogSWYgYW55IGFjdGl2aXRpZXMgcmVzcG9uZCB0byB0aGlzIGludGVudCB7QGxpbmsgI0FDVElPTl9UQUdfRElTQ09WRVJFRH0gd2lsbCBub3QgYmUgc3RhcnRlZC4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVEVDSE5PTE9HWV9ESVNDT1ZFUkVEID0gImFuZHJvaWQubmZjLmFjdGlvbi5URUNIX0RJU0NPVkVSRUQiOwpAQCAtNzYsNyArNzgsNiBAQAogCiAgICAgLyoqCiAgICAgICogTWFuZGF0b3J5IFRhZyBleHRyYSBmb3IgdGhlIEFDVElPTl9UQUcgaW50ZW50cy4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RBRyA9ICJhbmRyb2lkLm5mYy5leHRyYS5UQUciOwogCkBAIC0xMDIsNiArMTAzLDIwIEBACiAgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLlRSQU5TQUNUSU9OX0RFVEVDVEVEIjsKIAogICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IGFuIFJGIGZpZWxkIE9OIGhhcyBiZWVuIGRldGVjdGVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JGX0ZJRUxEX09OX0RFVEVDVEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLm5mYy5hY3Rpb24uUkZfRklFTERfT05fREVURUNURUQiOworCisgICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogYW4gUkYgRmllbGQgT0ZGIGhhcyBiZWVuIGRldGVjdGVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JGX0ZJRUxEX09GRl9ERVRFQ1RFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLlJGX0ZJRUxEX09GRl9ERVRFQ1RFRCI7CisKKyAgICAvKioKICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBhbiBhZGFwdGVyJ3Mgc3RhdGUgY2hhbmdlZCBiZXR3ZWVuIGVuYWJsZWQgYW5kIGRpc2FibGVkLgogICAgICAqCiAgICAgICogVGhlIG5ldyB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGV4dHJhIEVYVFJBX05FV19CT09MRUFOX1NUQVRFIGFuZCBqdXN0IGNvbnRhaW5zCkBAIC0xOTcsOCArMjEyLDcgQEAKICAgICAvLyBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeSgpIHdoZW4gTkZDIGNyYXNoZXMgLSB3ZSBhY2NlcHQgYSBiZXN0IGVmZm9ydAogICAgIC8vIHJlY292ZXJ5CiAgICAgcHJpdmF0ZSBzdGF0aWMgSU5mY0FkYXB0ZXIgc1NlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgSU5mY1RhZyBzVGFnU2VydmljZTsKIAogICAgIC8qKgogICAgICAqIEhlbHBlciB0byBjaGVjayBpZiB0aGlzIGRldmljZSBoYXMgRkVBVFVSRV9ORkMsIGJ1dCB3aXRob3V0IHVzaW5nCkBAIC0yMzUsNiArMjQ5LDEyIEBACiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY291bGQgbm90IHJldHJpZXZlIE5GQyBzZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNUYWdTZXJ2aWNlID0gc1NlcnZpY2UuZ2V0TmZjVGFnSW50ZXJmYWNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCByZXRyaWV2ZSBORkMgVGFnIHNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc1NlcnZpY2U7CiAgICAgfQpAQCAtMjg5LDcgKzMwOSw2IEBACiAgICAgICAgIGlmIChzZXR1cFNlcnZpY2UoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTcsMTAgKzMxNiwyMCBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIElOZmNBZGFwdGVyIGdldFNlcnZpY2UoKSB7CisgICAgICAgIGlzRW5hYmxlZCgpOyAgLy8gTk9QIGNhbGwgdG8gcmVjb3ZlciBzU2VydmljZSBpZiBpdCBpcyBzdGFsZQogICAgICAgICByZXR1cm4gc1NlcnZpY2U7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmluZGVyIGludGVyZmFjZSB0byB0aGUgdGFnIHNlcnZpY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSU5mY1RhZyBnZXRUYWdTZXJ2aWNlKCkgeworICAgICAgICBpc0VuYWJsZWQoKTsgIC8vIE5PUCBjYWxsIHRvIHJlY292ZXIgc1RhZ1NlcnZpY2UgaWYgaXQgaXMgc3RhbGUKKyAgICAgICAgcmV0dXJuIHNUYWdTZXJ2aWNlOworICAgIH0KKworICAgIC8qKgogICAgICAqIE5GQyBzZXJ2aWNlIGRlYWQgLSBhdHRlbXB0IGJlc3QgZWZmb3J0IHJlY292ZXJ5CiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTMwOSwxMSArMzM4LDIxIEBACiAgICAgICAgIElOZmNBZGFwdGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7CiAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCByZXRyaWV2ZSBORkMgc2VydmljZSBkdXJpbmcgc2VydmljZSByZWNvdmVyeSIpOworICAgICAgICAgICAgLy8gbm90aGluZyBtb3JlIGNhbiBiZSBkb25lIG5vdywgc1NlcnZpY2UgaXMgc3RpbGwgc3RhbGUsIHdlJ2xsIGhpdAorICAgICAgICAgICAgLy8gdGhpcyByZWNvdmVyeSBwYXRoIGFnYWluIGxhdGVyCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLyogYXNzaWduaW5nIHRvIHNTZXJ2aWNlIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRoaXMgaXMgYmVzdC1lZmZvcnQgY29kZQotICAgICAgICAgKiBhbmQgb24gYSB3ZWxsLWJlaGF2ZWQgc3lzdGVtIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgLy8gYXNzaWduaW5nIHRvIHNTZXJ2aWNlIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRoaXMgaXMgYmVzdC1lZmZvcnQgY29kZQorICAgICAgICAvLyBhbmQgb24gYSB3ZWxsLWJlaGF2ZWQgc3lzdGVtIHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgICAgc1NlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1RhZ1NlcnZpY2UgPSBzZXJ2aWNlLmdldE5mY1RhZ0ludGVyZmFjZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCByZXRyaWV2ZSBORkMgdGFnIHNlcnZpY2UgZHVyaW5nIHNlcnZpY2UgcmVjb3ZlcnkiKTsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbW9yZSBjYW4gYmUgZG9uZSBub3csIHNTZXJ2aWNlIGlzIHN0aWxsIHN0YWxlLCB3ZSdsbCBoaXQKKyAgICAgICAgICAgIC8vIHRoaXMgcmVjb3ZlcnkgcGF0aCBhZ2FpbiBsYXRlcgorICAgICAgICB9CisKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzczLDYgKzQxMiw2NiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgY2xhc3MgRm9yZWdyb3VuZERpc3BhdGNoUGF1c2VkTGlzdGVuZXIgaW1wbGVtZW50cyBPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZWQoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgICAgIGRpc2FibGVGb3JlZ3JvdW5kRGlzcGF0Y2hJbnRlcm5hbChhY3Rpdml0eSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIGZvcmVncm91bmQgZGlzcGF0Y2hpbmcgdG8gdGhlIGdpdmVuIEFjdGl2aXR5LiBUaGlzIHdpbGwgZm9yY2UgYWxsIE5GQyBJbnRlbnRzIHRoYXQKKyAgICAgKiBtYXRjaCB0aGUgZ2l2ZW4gZmlsdGVycyB0byBiZSBkZWxpdmVyZWQgdG8gdGhlIGFjdGl2aXR5IGJ5cGFzc2luZyB0aGUgc3RhbmRhcmQgZGlzcGF0Y2gKKyAgICAgKiBtZWNoYW5pc20uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eSB0aGUgQWN0aXZpdHkgdG8gZGlzcGF0Y2ggdG8KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBQZW5kaW5nSW50ZW50IHRvIHN0YXJ0IGZvciB0aGUgZGlzcGF0Y2gKKyAgICAgKiBAcGFyYW0gZmlsdGVycyB0aGUgSW50ZW50RmlsdGVycyB0byBvdmVycmlkZSBkaXNwYXRjaGluZyBmb3IKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuYWJsZUZvcmVncm91bmREaXNwYXRjaChBY3Rpdml0eSBhY3Rpdml0eSwgUGVuZGluZ0ludGVudCBpbnRlbnQsCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIuLi4gZmlsdGVycykgeworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCB8fCBpbnRlbnQgPT0gbnVsbCB8fCBmaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICghYWN0aXZpdHkuaXNSZXN1bWVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZvcmVnb3J1bmQgZGlzcGF0Y2hpbmcgY2FuIG9ubGx5IGJlIGVuYWJsZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aGVuIHlvdXIgYWN0aXZpdHkgaXMgcmVzdW1lZCIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eVRocmVhZC5jdXJyZW50QWN0aXZpdHlUaHJlYWQoKS5yZWdpc3Rlck9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcihhY3Rpdml0eSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZvcmVncm91bmREaXNwYXRjaFBhdXNlZExpc3RlbmVyKCkpOworICAgICAgICAgICAgc1NlcnZpY2UuZW5hYmxlRm9yZWdyb3VuZERpc3BhdGNoKGFjdGl2aXR5LmdldENvbXBvbmVudE5hbWUoKSwgaW50ZW50LCBmaWx0ZXJzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZXMgZm9yZWdyb3VuZCBhY3Rpdml0eSBkaXNwYXRjaGluZyBzZXR1cCB3aXRoCisgICAgICoge0BsaW5rICNlbmFibGVGb3JlZ3JvdW5kRGlzcGF0Y2h9LiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgQWN0aXZpdHkgcmV0dXJucyBmcm9tCisgICAgICogaXQncyA8Y29kZT5vblBhdXNlKCk8L2NvZGU+IG9yIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzYWJsZUZvcmVncm91bmREaXNwYXRjaChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBkaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoSW50ZXJuYWwoYWN0aXZpdHksIGZhbHNlKTsKKyAgICB9CisKKyAgICB2b2lkIGRpc2FibGVGb3JlZ3JvdW5kRGlzcGF0Y2hJbnRlcm5hbChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBmb3JjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1NlcnZpY2UuZGlzYWJsZUZvcmVncm91bmREaXNwYXRjaChhY3Rpdml0eS5nZXRDb21wb25lbnROYW1lKCkpOworICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhYWN0aXZpdHkuaXNSZXN1bWVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgbXVzdCBkaXNhYmxlIGZvcmdlZ3JvdW5kIGRpc3BhdGNoaW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIndoaWxlIHlvdXIgYWN0aXZpdHkgaXMgc3RpbGwgcmVzdW1lZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXQgdGhlIE5ERUYgTWVzc2FnZSB0aGF0IHRoaXMgTkZDIGFkYXB0ZXIgc2hvdWxkIGFwcGVhciBhcyB0byBUYWcKICAgICAgKiByZWFkZXJzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL1RhZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL1RhZy5qYXZhCmluZGV4IDc0MDQ5NTAuLjZjZGQ5ZjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UYWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVGFnLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIGluIHtAbGluayBOZmNBZGFwdGVyI0FDVElPTl9UQUdfRElTQ09WRVJFRH0gaW50ZW50cy4gQSB7QGxpbmsgVGFnfSBvYmplY3QgaXMgaW1tdXRhYmxlCiAgKiBhbmQgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhlIHRhZyBhdCB0aGUgdGltZSBvZiBkaXNjb3ZlcnkuIEl0IGNhbiBiZQogICogZGlyZWN0bHkgcXVlcmllZCBmb3IgaXRzIFVJRCBhbmQgVHlwZSwgb3IgdXNlZCB0byBjcmVhdGUgYSB7QGxpbmsgVGFnVGVjaG5vbG9neX0KLSAqICh3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfSkuCisgKiAod2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3l9KS4KICAqIDxwPgogICogQSB7QGxpbmsgVGFnfSBjYW4gIGJlIHVzZWQgdG8gY3JlYXRlIGEge0BsaW5rIFRhZ1RlY2hub2xvZ3l9IG9ubHkgd2hpbGUgdGhlIHRhZyBpcyBpbgogICogcmFuZ2UuIElmIGl0IGlzIHJlbW92ZWQgYW5kIHRoZW4gcmV0dXJuZWQgdG8gcmFuZ2UsIHRoZW4gdGhlIG1vc3QgcmVjZW50CkBAIC01NSw3ICs1NSw2IEBACiAgKiB0aW1lIGFuZCBjYWxscyBvbiB0aGlzIGNsYXNzIHdpbGwgcmV0cmlldmUgdGhvc2UgcmVhZC1vbmx5IHByb3BlcnRpZXMsIGFuZAogICogbm90IGNhdXNlIGFueSBmdXJ0aGVyIFJGIGFjdGl2aXR5IG9yIGJsb2NrLiBOb3RlIGhvd2V2ZXIgdGhhdCBhcnJheXMgcGFzc2VkIHRvIGFuZAogICogcmV0dXJuZWQgYnkgdGhpcyBjbGFzcyBhcmUgKm5vdCogY2xvbmVkLCBzbyBiZSBjYXJlZnVsIG5vdCB0byBtb2RpZnkgdGhlbS4KLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBUYWcgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBieXRlW10gbUlkOwpAQCAtMjQ5LDcgKzI0OCw5IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgLyoKKyAgICAvKioKKyAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb25uZWN0ZWRUZWNobm9sb2d5KGludCB0ZWNobm9sb2d5KSB7CkBAIC0yNjAsMTQgKzI2MSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKKyAgICAvKioKKyAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGVkVGVjaG5vbG9neSgpIHsKICAgICAgICAgcmV0dXJuIG1Db25uZWN0ZWRUZWNobm9sb2d5OwogICAgIH0KIAotICAgIC8qCisgICAgLyoqCisgICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUZWNobm9sb2d5RGlzY29ubmVjdGVkKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQppbmRleCA1NTNmNmVjLi5mNTI5ZWU1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQpAQCAtMzAsMTkgKzMwLDE0IEBACiAgKiBBIGJhc2UgY2xhc3MgZm9yIHRhZyB0ZWNobm9sb2dpZXMgdGhhdCBhcmUgYnVpbHQgb24gdG9wIG9mIHRyYW5zY2VpdmUoKS4KICAqLwogLyogcGFja2FnZSAqLyBhYnN0cmFjdCBjbGFzcyBCYXNpY1RhZ1RlY2hub2xvZ3kgaW1wbGVtZW50cyBUYWdUZWNobm9sb2d5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5GQyI7CiAKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBUYWcgbVRhZzsKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1Jc0Nvbm5lY3RlZDsKICAgICAvKnBhY2thZ2UqLyBpbnQgbVNlbGVjdGVkVGVjaG5vbG9neTsKICAgICBwcml2YXRlIGZpbmFsIE5mY0FkYXB0ZXIgbUFkYXB0ZXI7Ci0KLSAgICAvLyBGb2xsb3dpbmcgZmllbGRzIGFyZSBmaW5hbCBhZnRlciBjb25zdHJ1Y3Rpb24sIGV4Y2VwdCBmb3IKLSAgICAvLyBkdXJpbmcgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoKSB3aGVuIE5GQyBjcmFzaGVzLgotICAgIC8vIE5vdCBsb2NrZWQgLSB3ZSBhY2NlcHQgYSBiZXN0IGVmZm9ydCBhdHRlbXB0IHdoZW4gTkZDIGNyYXNoZXMuCi0gICAgLypwYWNrYWdlKi8gSU5mY0FkYXB0ZXIgbVNlcnZpY2U7Ci0gICAgLypwYWNrYWdlKi8gSU5mY1RhZyBtVGFnU2VydmljZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTkZDIjsKKyAgICAvKnBhY2thZ2UqLyBmaW5hbCBJTmZjQWRhcHRlciBtU2VydmljZTsKKyAgICAvKnBhY2thZ2UqLyBmaW5hbCBJTmZjVGFnIG1UYWdTZXJ2aWNlOwogCiAgICAgLyoqCiAgICAgICogQGhpZGUKQEAgLTY0LDExICs1OSw3IEBACiAKICAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOwogICAgICAgICBtU2VydmljZSA9IG1BZGFwdGVyLmdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBtVGFnU2VydmljZSA9IG1TZXJ2aWNlLmdldE5mY1RhZ0ludGVyZmFjZSgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbVRhZ1NlcnZpY2UgPSBtQWRhcHRlci5nZXRUYWdTZXJ2aWNlKCk7CiAgICAgICAgIG1UYWcgPSB0YWc7CiAgICAgICAgIG1TZWxlY3RlZFRlY2hub2xvZ3kgPSB0ZWNoOwogICAgIH0KQEAgLTgwLDE5ICs3MSw2IEBACiAgICAgICAgIHRoaXMoYWRhcHRlciwgdGFnLCB0YWcuZ2V0VGVjaG5vbG9neUxpc3QoKVswXSk7CiAgICAgfQogCi0gICAgLyoqIE5GQyBzZXJ2aWNlIGRlYWQgLSBhdHRlbXB0IGJlc3QgZWZmb3J0IHJlY292ZXJ5ICovCi0gICAgLypwYWNrYWdlKi8gdm9pZCBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShFeGNlcHRpb24gZSkgewotICAgICAgICBtQWRhcHRlci5hdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgLyogYXNzaWduaW5nIHRvIG1TZXJ2aWNlIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRoaXMgaXMgYmVzdC1lZmZvcnQgY29kZQotICAgICAgICAgKiBhbmQgb24gYSB3ZWxsLWJlaGF2ZWQgc3lzdGVtIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSAgICAgICAgbVNlcnZpY2UgPSBtQWRhcHRlci5nZXRTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtVGFnU2VydmljZSA9IG1TZXJ2aWNlLmdldE5mY1RhZ0ludGVyZmFjZSgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgInNlY29uZCBSZW1vdGVFeGNlcHRpb24gdHJ5aW5nIHRvIHJlY292ZXIgZnJvbSBkZWFkIE5GQyBzZXJ2aWNlIiwgZTIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB7QGxpbmsgVGFnfSB0aGlzIGNvbm5lY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgpAQCAtMTM1LDcgKzExMyw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbVRhZ1NlcnZpY2UuaXNQcmVzZW50KG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYzLDcgKzE0MSw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTkZDIHNlcnZpY2UgZGllZCIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgzLDIxICsxNjEsMjEgQEAKICAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoIW1Jc0Nvbm5lY3RlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVjaG5vbG9neSBub3QgY29ubmVjdGVkIHlldCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gbVRhZ1NlcnZpY2UucmVjb25uZWN0KG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSAhPSBFcnJvckNvZGVzLlNVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzQ29ubmVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1UYWcuc2V0VGVjaG5vbG9neURpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGVycm9yQ29kZSA9IG1UYWdTZXJ2aWNlLnJlY29ubmVjdChtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSk7CisKKyAgICAgICAgICAgIGlmIChlcnJvckNvZGUgIT0gRXJyb3JDb2Rlcy5TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgbUlzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVRhZy5zZXRUZWNobm9sb2d5RGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkaWVkIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtSXNDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1UYWcuc2V0VGVjaG5vbG9neURpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkaWVkIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxOSwxMyArMTk3LDI5IEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIG1UYWdTZXJ2aWNlLnJlY29ubmVjdChtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Jc0Nvbm5lY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgbVRhZy5zZXRUZWNobm9sb2d5RGlzY29ubmVjdGVkKCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogaW50ZXJuYWwgdHJhbnNjZWl2ZSAqLworICAgIC8qcGFja2FnZSovIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhLCBib29sZWFuIHJhdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gbVRhZ1NlcnZpY2UudHJhbnNjZWl2ZShtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSwgZGF0YSwgcmF3KTsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0cmFuc2NlaXZlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkaWVkIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZW5kIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgogICAgICAqIDxwPgpAQCAtMjM4LDE3ICsyMzIsNiBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHRhcmdldCBpcyBsb3N0IG9yIGNvbm5lY3Rpb24gY2xvc2VkCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gcmVzcG9uc2UgPSBtVGFnU2VydmljZS50cmFuc2NlaXZlKG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpLCBkYXRhLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0cmFuc2NlaXZlIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5GQyBzZXJ2aWNlIGRpZWQiKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9Jc29EZXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0lzb0RlcC5qYXZhCmluZGV4IDMyYTc1NDIuLmIxZjNlZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0lzb0RlcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0lzb0RlcC5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiAgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIElTTy1ERVAgdGVjaG5vbG9neSwgYWxzbyBrbm93biBhcwogICogSVNPMTQ0My00LgogICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neX0uCiAgKiBVc2UgdGhpcyBjbGFzcyB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgd2l0aCB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KICAqCiAgKiA8cD5BcHBsaWNhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHByb3RvY29sIHN0YWNrIG9uIHRvcCBvZgpAQCAtNTgsMTAgKzU4LDE0IEBACiAgICAgLyoqCiAgICAgICogM0Egb25seQogICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0SGlzdG9yaWNhbEJ5dGVzKCkgeyByZXR1cm4gbUhpc3RCeXRlczsgfQorICAgIHB1YmxpYyBieXRlW10gZ2V0SGlzdG9yaWNhbEJ5dGVzKCkgeworICAgICAgICByZXR1cm4gbUhpc3RCeXRlczsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiAzQiBvbmx5CiAgICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIaUxheWVyUmVzcG9uc2UoKSB7IHJldHVybiBtSGlMYXllclJlc3BvbnNlOyB9CisgICAgcHVibGljIGJ5dGVbXSBnZXRIaUxheWVyUmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiBtSGlMYXllclJlc3BvbnNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L01pZmFyZUNsYXNzaWMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L01pZmFyZUNsYXNzaWMuamF2YQppbmRleCA3OTlmMGE3OC4uYzVmYjM2MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTWlmYXJlQ2xhc3NpYy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L01pZmFyZUNsYXNzaWMuamF2YQpAQCAtMjYsMTMgKzI2LDEzIEBACiAvKioKICAqIENvbmNyZXRlIGNsYXNzIGZvciBUYWdUZWNobm9sb2d5Lk1JRkFSRV9DTEFTU0lDCiAgKgotICogTWlmYXJlIGNsYXNzaWMgaGFzIG4gc2VjdG9ycywgd2l0aCB2YXJ5aW5nIHNpemVzLCBhbHRob3VnaAotICogdGhleSBhcmUgYXQgbGVhc3QgdGhlIHNhbWUgcGF0dGVybiBmb3IgYW55IG9uZSBtaWZhcmUgY2xhc3NpYworICogTUlGQVJFIENsYXNzaWMgaGFzIG4gc2VjdG9ycywgd2l0aCB2YXJ5aW5nIHNpemVzLCBhbHRob3VnaAorICogdGhleSBhcmUgYXQgbGVhc3QgdGhlIHNhbWUgcGF0dGVybiBmb3IgYW55IG9uZSBNSUZBUkUgQ2xhc3NpYwogICogcHJvZHVjdC4gRWFjaCBzZWN0b3IgaGFzIHR3byBrZXlzLiBBdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBjb3JyZWN0CiAgKiBrZXkgaXMgbmVlZGVkIGJlZm9yZSBhY2Nlc3MgdG8gYW55IHNlY3Rvci4KICAqCiAgKiBFYWNoIHNlY3RvciBoYXMgayBibG9ja3MuCi0gKiBCbG9jayBzaXplIGlzIGNvbnN0YW50IGFjcm9zcyB0aGUgd2hvbGUgbWlmYXJlIGNsYXNzaWMgZmFtaWx5LgorICogQmxvY2sgc2l6ZSBpcyBjb25zdGFudCBhY3Jvc3MgdGhlIHdob2xlIE1JRkFSRSBjbGFzc2ljIGZhbWlseS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE1pZmFyZUNsYXNzaWMgZXh0ZW5kcyBCYXNpY1RhZ1RlY2hub2xvZ3kgewogICAgIC8qKgpAQCAtNDMsMTIgKzQzLDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gS0VZX0RFRkFVTFQgPQogICAgICAgICAgICAgeyhieXRlKTB4RkYsKGJ5dGUpMHhGRiwoYnl0ZSkweEZGLChieXRlKTB4RkYsKGJ5dGUpMHhGRiwoYnl0ZSkweEZGfTsKICAgICAvKioKLSAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCBNaWZhcmUgQXBwbGljYXRpb24gRGlyZWN0b3J5IHJlYWQga2V5LgorICAgICAqIFRoZSB3ZWxsLWtub3duLCBkZWZhdWx0IE1JRkFSRSBBcHBsaWNhdGlvbiBEaXJlY3RvcnkgcmVhZCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gS0VZX01JRkFSRV9BUFBMSUNBVElPTl9ESVJFQ1RPUlkgPQogICAgICAgICAgICAgeyhieXRlKTB4QTAsKGJ5dGUpMHhBMSwoYnl0ZSkweEEyLChieXRlKTB4QTMsKGJ5dGUpMHhBNCwoYnl0ZSkweEE1fTsKICAgICAvKioKLSAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCByZWFkIGtleSBmb3IgTkRFRiBkYXRhIG9uIGEgTWlmYXJlIENsYXNzaWMKKyAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCByZWFkIGtleSBmb3IgTkRFRiBkYXRhIG9uIGEgTUlGQVJFIENsYXNzaWMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBLRVlfTkZDX0ZPUlVNID0KICAgICAgICAgICAgIHsoYnl0ZSkweEQzLChieXRlKTB4RjcsKGJ5dGUpMHhEMywoYnl0ZSkweEY3LChieXRlKTB4RDMsKGJ5dGUpMHhGN307CkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShrZXksIDAsIGNtZCwgNiwgNik7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICgodHJhbnNjZWl2ZShjbWQpICE9IG51bGwpKSB7CisgICAgICAgICAgICBpZiAoKHRyYW5zY2VpdmUoY21kLCBmYWxzZSkgIT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgIGJ5dGUgYWRkciA9IChieXRlKSBibG9jazsKICAgICAgICAgYnl0ZVtdIGJsb2NrcmVhZF9jbWQgPSB7IDB4MzAsIGFkZHIgfTsKIAotICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShibG9ja3JlYWRfY21kKTsKKyAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmUoYmxvY2tyZWFkX2NtZCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI0LDcgKzMyNCw3IEBACiAgICAgICAgIGJsb2Nrd3JpdGVfY21kWzFdID0gYWRkcjsKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBibG9ja3dyaXRlX2NtZCwgMiwgZGF0YS5sZW5ndGgpOwogCi0gICAgICAgIHRyYW5zY2VpdmUoYmxvY2t3cml0ZV9jbWQpOworICAgICAgICB0cmFuc2NlaXZlKGJsb2Nrd3JpdGVfY21kLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICAgICAgYnl0ZSBhZGRyID0gKGJ5dGUpIGJsb2NrOwogICAgICAgICBieXRlW10gaW5jcl9jbWQgPSB7IChieXRlKSAweEMxLCAoYnl0ZSkgYmxvY2sgfTsKIAotICAgICAgICB0cmFuc2NlaXZlKGluY3JfY21kKTsKKyAgICAgICAgdHJhbnNjZWl2ZShpbmNyX2NtZCwgZmFsc2UpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGRlY3JlbWVudChpbnQgYmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zNTQsNyArMzU0LDcgQEAKICAgICAgICAgYnl0ZSBhZGRyID0gKGJ5dGUpIGJsb2NrOwogICAgICAgICBieXRlW10gZGVjcl9jbWQgPSB7IChieXRlKSAweEMwLCAoYnl0ZSkgYmxvY2sgfTsKIAotICAgICAgICB0cmFuc2NlaXZlKGRlY3JfY21kKTsKKyAgICAgICAgdHJhbnNjZWl2ZShkZWNyX2NtZCwgZmFsc2UpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyKGludCBibG9jaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgICAgICBieXRlIGFkZHIgPSAoYnl0ZSkgYmxvY2s7CiAgICAgICAgIGJ5dGVbXSB0cmFuc19jbWQgPSB7IChieXRlKSAweEIwLCAoYnl0ZSkgYmxvY2sgfTsKIAotICAgICAgICB0cmFuc2NlaXZlKHRyYW5zX2NtZCk7CisgICAgICAgIHRyYW5zY2VpdmUodHJhbnNfY21kLCBmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVzdG9yZShpbnQgYmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zNzIsMzMgKzM3Miw2IEBACiAgICAgICAgIGJ5dGUgYWRkciA9IChieXRlKSBibG9jazsKICAgICAgICAgYnl0ZVtdIHJlc3RfY21kID0geyAoYnl0ZSkgMHhDMiwgKGJ5dGUpIGJsb2NrIH07CiAKLSAgICAgICAgdHJhbnNjZWl2ZShyZXN0X2NtZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCBkYXRhIHRvIGEgdGFnIGFuZCByZWNlaXZlIHRoZSByZXNwb25zZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSByZXNwb25zZSBpcyByZWNlaXZlZC4gSXQgY2FuIGJlIGNhbmNlbGVkCi0gICAgICogd2l0aCB7QGxpbmsgI2Nsb3NlfS4KLSAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30gcGVybWlzc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIGJ5dGVzIHRvIHNlbmQKLSAgICAgKiBAcmV0dXJuIGJ5dGVzIHJlY2VpdmVkIGluIHJlc3BvbnNlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGlzIGxvc3Qgb3IgY29ubmVjdGlvbiBjbG9zZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIHRyYW5zY2VpdmUoYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQ29ubmVjdGVkKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSByZXNwb25zZSA9IG1UYWdTZXJ2aWNlLnRyYW5zY2VpdmUobVRhZy5nZXRTZXJ2aWNlSGFuZGxlKCksIGRhdGEsIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0cmFuc2NlaXZlIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5GQyBzZXJ2aWNlIGRpZWQiKTsKLSAgICAgICAgfQorICAgICAgICB0cmFuc2NlaXZlKHJlc3RfY21kLCBmYWxzZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTWlmYXJlVWx0cmFsaWdodC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTWlmYXJlVWx0cmFsaWdodC5qYXZhCmluZGV4IDcxMDNiNGQuLmU1MzA2MWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L01pZmFyZVVsdHJhbGlnaHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9NaWZhcmVVbHRyYWxpZ2h0LmphdmEKQEAgLTI2LDEzICsyNiwxMyBAQAogLyoqCiAgKiBDb25jcmV0ZSBjbGFzcyBmb3IgVGFnVGVjaG5vbG9neS5NSUZBUkVfVUxUUkFMSUdIVAogICoKLSAqIE1pZmFyZSBjbGFzc2ljIGhhcyBuIHNlY3RvcnMsIHdpdGggdmFyeWluZyBzaXplcywgYWx0aG91Z2gKLSAqIHRoZXkgYXJlIGF0IGxlYXN0IHRoZSBzYW1lIHBhdHRlcm4gZm9yIGFueSBvbmUgbWlmYXJlIGNsYXNzaWMKKyAqIE1JRkFSRSBVbHRyYWxpZ2h0IGhhcyBuIHNlY3RvcnMsIHdpdGggdmFyeWluZyBzaXplcywgYWx0aG91Z2gKKyAqIHRoZXkgYXJlIGF0IGxlYXN0IHRoZSBzYW1lIHBhdHRlcm4gZm9yIGFueSBvbmUgTUlGQVJFIFVsdHJhbGlnaHQKICAqIHByb2R1Y3QuIEVhY2ggc2VjdG9yIGhhcyB0d28ga2V5cy4gQXV0aGVudGljYXRpb24gd2l0aCB0aGUgY29ycmVjdAogICoga2V5IGlzIG5lZWRlZCBiZWZvcmUgYWNjZXNzIHRvIGFueSBzZWN0b3IuCiAgKgogICogRWFjaCBzZWN0b3IgaGFzIGsgYmxvY2tzLgotICogQmxvY2sgc2l6ZSBpcyBjb25zdGFudCBhY3Jvc3MgdGhlIHdob2xlIG1pZmFyZSBjbGFzc2ljIGZhbWlseS4KKyAqIEJsb2NrIHNpemUgaXMgY29uc3RhbnQgYWNyb3NzIHRoZSB3aG9sZSBNSUZBUkUgVWx0cmFsaWdodCBmYW1pbHkuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNaWZhcmVVbHRyYWxpZ2h0IGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VMVFJBTElHSFQgPSAxOwpAQCAtNjksNyArNjksNyBAQAogICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwogCiAgICAgICAgIGJ5dGVbXSBibG9ja3JlYWRfY21kID0geyAweDMwLCAoYnl0ZSlibG9jayB9OyAvLyBwaEhhbF9lTWlmYXJlUmVhZAotICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShibG9ja3JlYWRfY21kKTsKKyAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmUoYmxvY2tyZWFkX2NtZCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODksNyArODksNyBAQAogICAgICAgICBwYWdld3JpdGVfY21kWzFdID0gKGJ5dGUpIGJsb2NrOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHBhZ2V3cml0ZV9jbWQsIDIsIGRhdGEubGVuZ3RoKTsKIAotICAgICAgICB0cmFuc2NlaXZlKHBhZ2V3cml0ZV9jbWQpOworICAgICAgICB0cmFuc2NlaXZlKHBhZ2V3cml0ZV9jbWQsIGZhbHNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUJsb2NrKGludCBibG9jaywgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xMDAsMzQgKzEwMCw2IEBACiAgICAgICAgIGJsb2Nrd3JpdGVfY21kWzFdID0gKGJ5dGUpIGJsb2NrOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGJsb2Nrd3JpdGVfY21kLCAyLCBkYXRhLmxlbmd0aCk7CiAKLSAgICAgICAgdHJhbnNjZWl2ZShibG9ja3dyaXRlX2NtZCk7CisgICAgICAgIHRyYW5zY2VpdmUoYmxvY2t3cml0ZV9jbWQsIGZhbHNlKTsKICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBJdCBjYW4gYmUgY2FuY2VsZWQKLSAgICAgKiB3aXRoIHtAbGluayAjY2xvc2V9LgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgYnl0ZXMgdG8gc2VuZAotICAgICAqIEByZXR1cm4gYnl0ZXMgcmVjZWl2ZWQgaW4gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgaXMgbG9zdCBvciBjb25uZWN0aW9uIGNsb3NlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gbVRhZ1NlcnZpY2UudHJhbnNjZWl2ZShtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSwgZGF0YSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRyYW5zY2VpdmUgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTkZDIHNlcnZpY2UgZGllZCIpOwotICAgICAgICB9Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZGVmLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZGVmLmphdmEKaW5kZXggMDU4NzJmZS4uZjAzMzIyMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmRlZi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05kZWYuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtMzEsMTMgKzMyLDE1IEBACiAgKiB0byBpbnRlcmFjdCB3aXRoIE5ERUYgZGF0YS4gTWlGYXJlIENsYXNzaWMgY2FyZHMgdGhhdCBwcmVzZW50IE5ERUYgZGF0YSBtYXkgYWxzbyBiZSB1c2VkCiAgKiB2aWEgdGhpcyBjbGFzcy4gVG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0ZWNobm9sb2d5IGJlaW5nIHVzZWQgY2FsbCB7QGxpbmsgI2dldFRlY2hub2xvZ3lJZCgpfQogICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neX0uCiAgKgogICogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KICAqIFVzZSBvZiB0aGlzIGNsYXNzIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30KICAqIHBlcm1pc3Npb24uCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBOZGVmIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5GQyI7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOREVGX01PREVfUkVBRF9PTkxZID0gMTsKICAgICAvKiogQGhpZGUgKi8KQEAgLTE2OCw3ICsxNzEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KQEAgLTIwMCw3ICsyMDMsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGFnIGlzIG5vdCBuZGVmIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjIxLDcgKzIyNCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgQ0MgZmllbGQgdG8gaW5kaWNhdGUgdGhpcyB0YWcgaXMgcmVhZC1vbmx5CisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYSB0YWcgY2FuIGJlIG1hZGUgcmVhZC1vbmx5IHdpdGgKKyAgICAgKiB7QGxpbmsgI21ha2VSZWFkb25seSgpfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbk1ha2VSZWFkb25seSgpIHsKKyAgICAgICAgaWYgKG1OZGVmVHlwZSA9PSBORkNfRk9SVU1fVFlQRV8xIHx8IG1OZGVmVHlwZSA9PSBORkNfRk9SVU1fVFlQRV8yKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIENDIGZpZWxkIHRvIGluZGljYXRlIHRoaXMgdGFnIGlzIHJlYWQtb25seQorICAgICAqIGFuZCBwZXJtYW5lbnRseSBzZXRzIHRoZSBsb2NrIGJpdHMgdG8gcHJldmVudCBhbnkgZnVydGhlciBOREVGCisgICAgICogbW9kaWZpY2F0aW9ucy4KKyAgICAgKiBUaGlzIGlzIGEgb25lLXdheSBwcm9jZXNzIGFuZCBjYW4gbm90IGJlIHJldmVydGVkIQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBtYWtlUmVhZG9ubHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjQxLDIyICsyNTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEF0dGVtcHQgdG8gdXNlIHRhZyBzcGVjaWZpYyB0ZWNobm9sb2d5IHRvIHJlYWxseSBtYWtlCi0gICAgICogdGhlIHRhZyByZWFkLW9ubHkKLSAgICAgKiBGb3IgTkZDIEZvcnVtIFR5cGUgMSBhbmQgMiBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1ha2VMb3dMZXZlbFJlYWRvbmx5KCkgewotICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwotCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgewogICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmRlZkZvcm1hdGFibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05kZWZGb3JtYXRhYmxlLmphdmEKaW5kZXggMjIyYzU1OC4uMzliZDU5NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmRlZkZvcm1hdGFibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZGVmRm9ybWF0YWJsZS5qYXZhCkBAIC0yMywxOSArMjMsMjIgQEAKIGltcG9ydCBhbmRyb2lkLm5mYy5UYWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgogICogQW4gaW50ZXJmYWNlIHRvIGEge0BsaW5rIFRhZ30gYWxsb3dpbmcgdG8gZm9ybWF0IHRoZSB0YWcgYXMgTkRFRi4KICAqCi0gKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGludGVyZmFjZSB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgaW50ZXJmYWNlIHdpdGgge0BsaW5rIFRhZyNnZXRUZWNobm9sb2d5fS4KICAqCiAgKiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgogICogVXNlIG9mIHRoaXMgY2xhc3MgcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfQogICogcGVybWlzc2lvbi4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5kZWZGb3JtYXRhYmxlIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5GQyI7CisKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciwgdG8gYmUgdXNlZCBieSBOZmNBZGFwdGVyCiAgICAgICogQGhpZGUKQEAgLTg1LDcgKzg4LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNBLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNBLmphdmEKaW5kZXggZWY0Njc2Mi4uNWNiODE5MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjQS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY0EuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICogQSBsb3ctbGV2ZWwgY29ubmVjdGlvbiB0byBhIHtAbGluayBUYWd9IHVzaW5nIHRoZSBORkMtQSB0ZWNobm9sb2d5LCBhbHNvIGtub3duIGFzCiAgKiBJU08xNDQzLTNBLgogICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neX0uCiAgKiBVc2UgdGhpcyBjbGFzcyB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgd2l0aCB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KICAqCiAgKiA8cD5BcHBsaWNhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHByb3RvY29sIHN0YWNrIG9uIHRvcCBvZgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjQi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjQi5qYXZhCmluZGV4IDI2N2M5NGQuLmRjOWRkN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY0IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNCLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKICAqIEEgbG93LWxldmVsIGNvbm5lY3Rpb24gdG8gYSB7QGxpbmsgVGFnfSB1c2luZyB0aGUgTkZDLUIgdGVjaG5vbG9neSwgYWxzbyBrbm93biBhcwogICogSVNPMTQ0My0zQi4KICAqCi0gKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3koaW50KX0uCisgKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3l9LgogICogVXNlIHRoaXMgY2xhc3MgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHdpdGgge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCiAgKgogICogPHA+QXBwbGljYXRpb25zIG11c3QgaW1wbGVtZW50IHRoZWlyIG93biBwcm90b2NvbCBzdGFjayBvbiB0b3Agb2YKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY0YuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY0YuamF2YQppbmRleCA2NzQxYWM4Li5kZDBlMmY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNGLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjRi5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIE5GQy1GIHRlY2hub2xvZ3ksIGFsc28ga25vd24gYXMKICAqIEpJUzYzMTktNC4KICAqCi0gKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3koaW50KX0uCisgKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3l9LgogICogVXNlIHRoaXMgY2xhc3MgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHdpdGgge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCiAgKgogICogPHA+QXBwbGljYXRpb25zIG11c3QgaW1wbGVtZW50IHRoZWlyIG93biBwcm90b2NvbCBzdGFjayBvbiB0b3Agb2YKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY1YuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY1YuamF2YQppbmRleCA0NjBkZTZhLi5kYTczZjVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNWLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjVi5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIE5GQy1WIHRlY2hub2xvZ3ksIGFsc28ga25vd24gYXMKICAqIElTTzE1NjkzLgogICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neX0uCiAgKiBVc2UgdGhpcyBjbGFzcyB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgd2l0aCB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KICAqCiAgKiA8cD5BcHBsaWNhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHByb3RvY29sIHN0YWNrIG9uIHRvcCBvZgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI4YTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKaW5kZXggNTJiMDY0My4uYTg1OWUzYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQpAQCAtNTE3LDggKzUxNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUxheW91dC53aW5kb3dBbmltYXRpb25zID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fV2FsbHBhcGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCA9IG5ldyBJbnB1dENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmFkZChtV2luZG93LCBtTGF5b3V0LCBWaWV3LlZJU0lCTEUsIG1Db250ZW50SW5zZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbi5hZGQobVdpbmRvdywgbUxheW91dCwgVmlldy5WSVNJQkxFLCBtQ29udGVudEluc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Q2hhbm5lbCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGFkZCB3aW5kb3cgd2hpbGUgdXBkYXRpbmcgd2FsbHBhcGVyIHN1cmZhY2UuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFF1ZXVlLnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwsIG1JbnB1dEhhbmRsZXIsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKaW5kZXggZDI0YWY1Mi4uNmI0NGY5ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICogZm9yIHRoZSBkZXZpY2UgeW91IGFyZSBydW5uaW5nIG9uLiAgRm9yIGV4YW1wbGU6CiAgKgogICogPHByZT5MYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UKLSAqICAgICAgQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7PC9wcmU+CisgKiAgICAgIChDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTs8L3ByZT4KICAqIAogICogPHA+CiAgKiBUbyBjcmVhdGUgYSBuZXcgTGF5b3V0SW5mbGF0ZXIgd2l0aCBhbiBhZGRpdGlvbmFsIHtAbGluayBGYWN0b3J5fSBmb3IgeW91cgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKaW5kZXggYjY4Mjk0Ny4uYjNiODBmNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhCkBAIC00MDg3LDcgKzQwODcsNyBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgZ29uZSB0aHJvdWdoIGEgc2lnbmlmaWNhbnQgY2hhcmdlIChmcm9tIGEgdmVyeSBsb3cKICAgICAgICAgICAgICAgICAvLyBsZXZlbCB0byBhIG5vdyB2ZXJ5IGhpZ2ggbGV2ZWwpLgogICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9TVEFUVVNfRlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGV2ZWwgPj0gOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxldmVsID49IDkwCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobURpc2NoYXJnZUN1cnJlbnRMZXZlbCA8IDIwICYmIGxldmVsID49IDgwKSkgewogICAgICAgICAgICAgICAgICAgICBkb1dyaXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgcmVzZXRBbGxTdGF0c0xvY2tlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKaW5kZXggYmM3NDlkOC4uMmJjOWRkMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIApAQCAtNTQsMjYgKzU1LDQxIEBACiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGltZURpc3BsYXlGb3JlZ3JvdW5kOwogICAgIHByaXZhdGUgQW1QbSBtQW1QbTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlciBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1MaXZlID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkOworICAgIHByaXZhdGUgaW50IG1BdHRhY2hlZCA9IDA7IC8vIGZvciBkZWJ1Z2dpbmcgLSB0ZWxscyB1cyB3aGV0aGVyIGF0dGFjaC9kZXRhY2ggaXMgdW5iYWxhbmNlZAogCiAgICAgLyogY2FsbGVkIGJ5IHN5c3RlbSBvbiBtaW51dGUgdGlja3MgKi8KICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUludGVudFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXZlICYmIGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkFDVElPTl9USU1FWk9ORV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQb3N0IGEgcnVubmFibGUgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGJyb2FkY2FzdC4KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaW1lKCk7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtSW50ZW50UmVjZWl2ZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUaW1lQ2hhbmdlZFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8RGlnaXRhbENsb2NrPiBtQ2xvY2s7CisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBwdWJsaWMgVGltZUNoYW5nZWRSZWNlaXZlcihEaWdpdGFsQ2xvY2sgY2xvY2spIHsKKyAgICAgICAgICAgIG1DbG9jayA9IG5ldyBXZWFrUmVmZXJlbmNlPERpZ2l0YWxDbG9jaz4oY2xvY2spOworICAgICAgICAgICAgbUNvbnRleHQgPSBjbG9jay5nZXRDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gUG9zdCBhIHJ1bm5hYmxlIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBicm9hZGNhc3QuCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRpbWV6b25lQ2hhbmdlZCA9CisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9USU1FWk9ORV9DSEFOR0VEKTsKKyAgICAgICAgICAgIGZpbmFsIERpZ2l0YWxDbG9jayBjbG9jayA9IG1DbG9jay5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvY2subUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5tQ2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sudXBkYXRlVGltZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcih0aGlzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07CiAKICAgICBzdGF0aWMgY2xhc3MgQW1QbSB7CiAgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUFtUG07CkBAIC05OSwxNCArMTE1LDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIEZvcm1hdENoYW5nZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKLSAgICAgICAgcHVibGljIEZvcm1hdENoYW5nZU9ic2VydmVyKCkgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvcm1hdENoYW5nZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPERpZ2l0YWxDbG9jaz4gbUNsb2NrOworICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHB1YmxpYyBGb3JtYXRDaGFuZ2VPYnNlcnZlcihEaWdpdGFsQ2xvY2sgY2xvY2spIHsKICAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICAgICAgbUNsb2NrID0gbmV3IFdlYWtSZWZlcmVuY2U8RGlnaXRhbENsb2NrPihjbG9jayk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNsb2NrLmdldENvbnRleHQoKTsKICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzZXREYXRlRm9ybWF0KCk7Ci0gICAgICAgICAgICB1cGRhdGVUaW1lKCk7CisgICAgICAgICAgICBEaWdpdGFsQ2xvY2sgZGlnaXRhbENsb2NrID0gbUNsb2NrLmdldCgpOworICAgICAgICAgICAgaWYgKGRpZ2l0YWxDbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGlnaXRhbENsb2NrLnNldERhdGVGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBkaWdpdGFsQ2xvY2sudXBkYXRlVGltZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzksMTEgKzE2NCwxMSBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CiAKLSAgICAgICAgaWYgKG1BdHRhY2hlZCkgcmV0dXJuOwotICAgICAgICBtQXR0YWNoZWQgPSB0cnVlOworICAgICAgICBtQXR0YWNoZWQrKzsKIAotICAgICAgICBpZiAobUxpdmUpIHsKLSAgICAgICAgICAgIC8qIG1vbml0b3IgdGltZSB0aWNrcywgdGltZSBjaGFuZ2VkLCB0aW1lem9uZSAqLworICAgICAgICAvKiBtb25pdG9yIHRpbWUgdGlja3MsIHRpbWUgY2hhbmdlZCwgdGltZXpvbmUgKi8KKyAgICAgICAgaWYgKG1JbnRlbnRSZWNlaXZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW50ZW50UmVjZWl2ZXIgPSBuZXcgVGltZUNoYW5nZWRSZWNlaXZlcih0aGlzKTsKICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fVElNRV9USUNLKTsKICAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9USU1FX0NIQU5HRUQpOwpAQCAtMTUyLDkgKzE3NywxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgLyogbW9uaXRvciAxMi8yNC1ob3VyIGRpc3BsYXkgcHJlZmVyZW5jZSAqLwotICAgICAgICBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIgPSBuZXcgRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIoKTsKLSAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLkNPTlRFTlRfVVJJLCB0cnVlLCBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICBpZiAobUZvcm1hdENoYW5nZU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VPYnNlcnZlciA9IG5ldyBGb3JtYXRDaGFuZ2VPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQ09OVEVOVF9VUkksIHRydWUsIG1Gb3JtYXRDaGFuZ2VPYnNlcnZlcik7CisgICAgICAgIH0KIAogICAgICAgICB1cGRhdGVUaW1lKCk7CiAgICAgfQpAQCAtMTYzLDE2ICsxOTAsMTkgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKIAotICAgICAgICBpZiAoIW1BdHRhY2hlZCkgcmV0dXJuOwotICAgICAgICBtQXR0YWNoZWQgPSBmYWxzZTsKKyAgICAgICAgbUF0dGFjaGVkLS07CiAKLSAgICAgICAgaWYgKG1MaXZlKSB7CisgICAgICAgIGlmIChtSW50ZW50UmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1JbnRlbnRSZWNlaXZlcik7CiAgICAgICAgIH0KLSAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKLSAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIpOwotICAgIH0KKyAgICAgICAgaWYgKG1Gb3JtYXRDaGFuZ2VPYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICB9CiAKKyAgICAgICAgbUZvcm1hdENoYW5nZU9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgbUludGVudFJlY2VpdmVyID0gbnVsbDsKKyAgICB9CiAKICAgICB2b2lkIHVwZGF0ZVRpbWUoQ2FsZW5kYXIgYykgewogICAgICAgICBtQ2FsZW5kYXIgPSBjOwpAQCAtMTgwLDkgKzIxMCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpbWUoKSB7Ci0gICAgICAgIGlmIChtTGl2ZSkgewotICAgICAgICAgICAgbUNhbGVuZGFyLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgbUNhbGVuZGFyLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAKICAgICAgICAgQ2hhclNlcXVlbmNlIG5ld1RpbWUgPSBEYXRlRm9ybWF0LmZvcm1hdChtRm9ybWF0LCBtQ2FsZW5kYXIpOwogICAgICAgICBtVGltZURpc3BsYXlCYWNrZ3JvdW5kLnNldFRleHQobmV3VGltZSk7CkBAIC0xOTUsOCArMjIzLDQgQEAKICAgICAgICAgICAgID8gTTI0IDogTTEyOwogICAgICAgICBtQW1QbS5zZXRTaG93QW1QbShtRm9ybWF0LmVxdWFscyhNMTIpKTsKICAgICB9Ci0KLSAgICB2b2lkIHNldExpdmUoYm9vbGVhbiBsaXZlKSB7Ci0gICAgICAgIG1MaXZlID0gbGl2ZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmRlZThiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKKworcHVibGljIGNsYXNzIENvbnRlbnRSZXNvbHZlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JGaW5hbGl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETzogV2FudCBhIHRlc3QgY2FzZSB0aGF0IG1vcmUgcHJlZGljdGFibHkgcmVwcm9kdWNlIHRoaXMgaXNzdWUuIFNlbGVjdGVkCisgICAgICAgIC8vIDYwMCBhcyB0aGlzIGNhdXNlcyB0aGUgcHJvYmxlbSAxMDAlIG9mIHRoZSBydW5zIG9uIGN1cnJlbnQgaHcsIGl0IG1pZ2h0IG5vdAorICAgICAgICAvLyBkbyBzbyBvbiBzb21lIG90aGVyIGNvbmZpZ3VyYXRpb24gdGhvdWdoLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYwMDsgaSsrKSB7CisgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcyBiL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKaW5kZXggNjdmMWZlYy4uNjFmNTA1YyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcworKysgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCkBAIC00ODgsMTIgKzQ4OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL3Byb2d1YXJkLmh0bWwiPlByb0d1YXJkPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvZ3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCNzcWxpdGUiPnNxbGl0ZTM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL3RyYWNldmlldy5odG1sIj5UcmFjZXZpZXc8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvZGV2ZWxvcGluZy90b29scy96aXBhbGlnbi5odG1sIj56aXBhbGlnbjwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL2RldmVsb3BpbmcvdG9vbHMvcHJvZ3VhcmQuaHRtbCI+UHJvR3VhcmQ8L2E+Cis8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sI3NxbGl0ZSI+c3FsaXRlMzwvYT48L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvZGV2ZWxvcGluZy90b29scy90cmFjZXZpZXcuaHRtbCIgPlRyYWNldmlldzwvYT48L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvZGV2ZWxvcGluZy90b29scy96aXBhbGlnbi5odG1sIiA+emlwYWxpZ248L2E+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+CiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IDlhNmY3ODcuLmI2ZTBjMzAgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMTE3LDcgKzExNywxMSBAQAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0RHJtU2VydmljZUxpc3RlbmVyKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiYgZHJtU2VydmljZUxpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtU2VydmljZUxpc3RlbmVycy5hZGQodW5pcXVlSWQsIGRybVNlcnZpY2VMaXN0ZW5lcik7CisgICAgaWYgKE5VTEwgIT0gZHJtU2VydmljZUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1TZXJ2aWNlTGlzdGVuZXJzLmFkZCh1bmlxdWVJZCwgZHJtU2VydmljZUxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VydmljZUxpc3RlbmVycy5yZW1vdmVJdGVtKHVuaXF1ZUlkKTsKKyAgICB9CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtTWFuYWdlckNsaWVudC5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtTWFuYWdlckNsaWVudC5qYXZhCmluZGV4IDJmNTRiMzMuLjZjYWY2NzggMTAwNjQ0Ci0tLSBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQuamF2YQorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmphdmEKQEAgLTczOCwyNiArNzM4LDM0IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFVyaVRvUGF0aChVcmkgdXJpKSB7CiAgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gc2NoZW1lIHx8IHNjaGVtZS5lcXVhbHMoIiIpIHx8IHNjaGVtZS5lcXVhbHMoQ29udGVudFJlc29sdmVyLlNDSEVNRV9GSUxFKSkgewotICAgICAgICAgICAgcGF0aCA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1lLmVxdWFscyhDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHtNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBfTsKLSAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIHByb2plY3Rpb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBVcmkgaXMgbm90IGZvcm1hdHRlZCBpbiBhIHdheSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJzbyB0aGF0IGl0IGNhbiBiZSBmb3VuZCBpbiBtZWRpYSBzdG9yZS4iKTsKKyAgICAgICAgaWYgKG51bGwgIT0gdXJpKSB7CisgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOworICAgICAgICAgICAgaWYgKG51bGwgPT0gc2NoZW1lIHx8IHNjaGVtZS5lcXVhbHMoIiIpIHx8CisgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5lcXVhbHMoQ29udGVudFJlc29sdmVyLlNDSEVNRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSB1cmkuZ2V0UGF0aCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWUuZXF1YWxzKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHtNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBfTsKKyAgICAgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIHByb2plY3Rpb24sIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGN1cnNvciB8fCAwID09IGN1cnNvci5nZXRDb3VudCgpIHx8ICFjdXJzb3IubW92ZVRvRmlyc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gVXJpIGNvdWxkIG5vdCBiZSBmb3VuZCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIG1lZGlhIHN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHBhdGhJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBjdXJzb3IuZ2V0U3RyaW5nKHBhdGhJbmRleCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gVXJpIGlzIG5vdCBmb3JtYXR0ZWQgaW4gYSB3YXkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvIHRoYXQgaXQgY2FuIGJlIGZvdW5kIGluIG1lZGlhIHN0b3JlLiIpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGN1cnNvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIFVyaSBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG51bGwgPT0gY3Vyc29yIHx8IDAgPT0gY3Vyc29yLmdldENvdW50KCkgfHwgIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gVXJpIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBtZWRpYSBzdG9yZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBhdGhJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSk7Ci0gICAgICAgICAgICBwYXRoID0gY3Vyc29yLmdldFN0cmluZyhwYXRoSW5kZXgpOwotICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBVcmkgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcGF0aDsKICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcAppbmRleCA1NzhlMTM1Li43YjUxODIyIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKIERybU1hbmFnZXJDbGllbnQ6On5Ecm1NYW5hZ2VyQ2xpZW50KCkgewogICAgIERybU1hbmFnZXJDbGllbnRJbXBsOjpyZW1vdmUobVVuaXF1ZUlkKTsKICAgICBtRHJtTWFuYWdlckNsaWVudEltcGwtPnJlbW92ZUNsaWVudChtVW5pcXVlSWQpOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+c2V0T25JbmZvTGlzdGVuZXIobVVuaXF1ZUlkLCBOVUxMKTsKICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnRJbXBsOyBtRHJtTWFuYWdlckNsaWVudEltcGwgPSBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCmluZGV4IGYzOTEzMWQuLmQyMGRlOTIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC04MSw3ICs4MSw4IEBACiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiYgaW5mb0xpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtT25JbmZvTGlzdGVuZXIgPSBpbmZvTGlzdGVuZXI7Ci0gICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldERybVNlcnZpY2VMaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldERybVNlcnZpY2VMaXN0ZW5lcih1bmlxdWVJZCwKKyAgICAgICAgICAgIChOVUxMICE9IGluZm9MaXN0ZW5lci5nZXQoKSkgPyB0aGlzIDogTlVMTCk7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRkYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvTWltZVR5cGVVdGlsLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGliZHJtdXRpbGl0eQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJkdm0gXAorICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJsb2cKKworCitiYXNlIDo9IGZyYW1ld29ya3MvYmFzZQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKEpOSV9IX0lOQ0xVREUpIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUgXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0gXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0vcGx1Z2lucyBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKKworaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKExPQ0FMX1BBVEgpL3Rvb2xzCisKK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvTWltZVR5cGVVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxMmE2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTUlNRVRZUEVVVElMX0hfXworI2RlZmluZSBfX01JTUVUWVBFVVRJTF9IX18KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNaW1lVHlwZVV0aWwgeworCitwdWJsaWM6CisKKyAgICBNaW1lVHlwZVV0aWwoKSB7fQorCisgICAgdmlydHVhbCB+TWltZVR5cGVVdGlsKCkge30KKworLyoqCisgKiBNYXkgY29udmVydCB0aGUgbWltZXR5cGUgaWYgdGhlcmUgaXMgYSB3ZWxsIGtub3duCisgKiByZXBsYWNlbWVudCBtaW1ldHlwZSBvdGhlcndpc2UgdGhlIG9yaWdpbmFsIG1pbWV0eXBlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbWltZVR5cGUgLSBtaW1ldHlwZSBpbiBsb3dlciBjYXNlIHRvIGNvbnZlcnQuCisgKgorICogQHJldHVybiBtaW1ldHlwZSBvciBudWxsLgorICovCitzdGF0aWMgU3RyaW5nOCBjb252ZXJ0TWltZVR5cGUoU3RyaW5nOCYgbWltZVR5cGUpOworCit9OworfTsKKworI2VuZGlmIC8qIF9fTUlNRVRZUEVVVElMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZmY1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9TZXNzaW9uTWFwLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fU0VTU0lPTk1BUF9IX18KKyNkZWZpbmUgX19TRVNTSU9OTUFQX0hfXworCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEEgd3JhcHBlciB0ZW1wbGF0ZSBjbGFzcyBmb3IgaGFuZGxpbmcgRFJNIEVuZ2luZSBzZXNzaW9ucy4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE5PREU+CitjbGFzcyBTZXNzaW9uTWFwIHsKKworcHVibGljOgorICAgIEtleWVkVmVjdG9yPGludCwgTk9ERT4gbWFwOworCisgICAgU2Vzc2lvbk1hcCgpIHt9CisKKyAgICB2aXJ0dWFsIH5TZXNzaW9uTWFwKCkgeworICAgICAgICBkZXN0cm95TWFwKCk7CisgICAgfQorCisvKioKKyAqIEFkZHMgYSBuZXcgdmFsdWUgaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlLiBJdCBleHBlY3RzIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgYWxyZWFkeQorICogZm9yIHRoZSBzZXNzaW9uIG9iamVjdAorICoKKyAqIEBwYXJhbSBrZXkgLSBrZXkgb3IgU2Vzc2lvbiBJRAorICogQHBhcmFtIHZhbHVlIC0gc2Vzc2lvbiBvYmplY3QgdG8gYWRkCisgKgorICogQHJldHVybiBib29sZWFuIHJlc3VsdCBvZiBhZGRpbmcgdmFsdWUuIHJldHVybnMgZmFsc2UgaWYga2V5IGlzIGFscmVhZHkgZXhpc3QuCisgKi8KK2Jvb2wgYWRkVmFsdWUoaW50IGtleSwgTk9ERSB2YWx1ZSkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBpZiAoIWlzQ3JlYXRlZChrZXkpKSB7CisgICAgICAgIG1hcC5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIHJldHVybnMgdGhlIHNlc3Npb24gb2JqZWN0IGJ5IHRoZSBrZXkKKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9yIFNlc3Npb24gSUQKKyAqCisgKiBAcmV0dXJuIHNlc3Npb24gb2JqZWN0IGFzIHBlciB0aGUga2V5CisgKi8KK05PREUgZ2V0VmFsdWUoaW50IGtleSkgeworICAgIE5PREUgdmFsdWUgPSBOVUxMOworCisgICAgaWYgKGlzQ3JlYXRlZChrZXkpKSB7CisgICAgICAgIHZhbHVlID0gKE5PREUpIG1hcC52YWx1ZUZvcihrZXkpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2Vzc2lvbiBtYXAgdGFibGUKKyAqCisgKiBAcmV0dXJuIGNvdW50IG9mIG51bWJlciBvZiBzZXNzaW9uIG9iamVjdHMuCisgKi8KK2ludCBnZXRTaXplKCkgeworICAgIHJldHVybiBtYXAuc2l6ZSgpOworfQorCisvKioKKyAqIHJldHVybnMgdGhlIHNlc3Npb24gb2JqZWN0IGJ5IHRoZSBpbmRleCBpbiB0aGUgc2Vzc2lvbiBtYXAgdGFibGUKKyAqCisgKiBAcGFyYW0gaW5kZXggLSBpbmRleCBvZiB0aGUgdmFsdWUgcmVxdWlyZWQKKyAqCisgKiBAcmV0dXJuIHNlc3Npb24gb2JqZWN0IGFzIHBlciB0aGUgaW5kZXgKKyAqLworTk9ERSBnZXRWYWx1ZUF0KHVuc2lnbmVkIGludCBpbmRleCkgeworICAgIE5PREUgdmFsdWUgPSBOVUxMOworCisgICAgaWYgKG1hcC5zaXplKCkgPiBpbmRleCkgeworICAgICAgdmFsdWUgPSBtYXAudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIGRlbGV0ZXMgdGhlIG9iamVjdCBmcm9tIHNlc3Npb24gbWFwLiBJdCBhbHNvIGZyZWVzIHVwIG1lbW9yeSBmb3IgdGhlIHNlc3Npb24gb2JqZWN0LgorICoKKyAqIEBwYXJhbSBrZXkgLSBrZXkgb2YgdGhlIHZhbHVlIHRvIGJlIGRlbGV0ZWQKKyAqCisgKi8KK3ZvaWQgcmVtb3ZlVmFsdWUoaW50IGtleSkgeworICAgIGRlbGV0ZVZhbHVlKGdldFZhbHVlKGtleSkpOworICAgIG1hcC5yZW1vdmVJdGVtKGtleSk7Cit9CisKKy8qKgorICogZGVjaWRlcyBpZiBzZXNzaW9uIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9mIHRoZSB2YWx1ZSBmb3IgdGhlIHNlc3Npb24KKyAqCisgKiBAcmV0dXJuIGJvb2xlYW4gcmVzdWx0IG9mIHdoZXRoZXIgc2Vzc2lvbiBpcyBjcmVhdGVkCisgKi8KK2Jvb2wgaXNDcmVhdGVkKGludCBrZXkpIHsKKyAgICByZXR1cm4gKDAgPD0gbWFwLmluZGV4T2ZLZXkoa2V5KSk7Cit9CisKKy8qKgorICogZW1wdHkgdGhlIGVudGlyZSBzZXNzaW9uIHRhYmxlLiBJdCByZWxlYXNlcyBhbGwgdGhlIG1lbW9yeSBmb3Igc2Vzc2lvbiBvYmplY3RzLgorICovCit2b2lkIGRlc3Ryb3lNYXAoKSB7CisgICAgaW50IHNpemUgPSBtYXAuc2l6ZSgpOworICAgIGludCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZGVsZXRlVmFsdWUobWFwLnZhbHVlQXQoaSkpOworICAgIH0KKworICAgIG1hcC5jbGVhcigpOworfQorCisvKioKKyAqIGZyZWUgdXAgdGhlIG1lbW9yeSBmb3IgdGhlIHNlc3Npb24gb2JqZWN0LgorICogTWFrZSBzdXJlIGlmIGFueSByZWZlcmVuY2UgdG8gdGhlIHNlc3Npb24gb2JqZWN0IGFueXdoZXJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBhCisgKiBkYW5nbGUgcG9pbnRlciBhZnRlciB0aGlzIGNhbGwuCisgKgorICogQHBhcmFtIHZhbHVlIC0gc2Vzc2lvbiBvYmplY3QgdG8gZnJlZQorICoKKyAqLwordm9pZCBkZWxldGVWYWx1ZShOT0RFIHZhbHVlKSB7CisgICAgZGVsZXRlIHZhbHVlOworfQorCit9OworCit9OworCisjZW5kaWYgLyogX19TRVNTSU9OTUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTkwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvc3JjL01pbWVUeXBlVXRpbC5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8TWltZVR5cGVVdGlsLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiTWltZVR5cGVVdGlsIgorCitlbnVtIHsKKyAgICBNSU1FVFlQRV9BVURJTyAgICAgICA9IDAsCisgICAgTUlNRVRZUEVfQVBQTElDQVRJT04gPSAxLAorICAgIE1JTUVUWVBFX0lNQUdFICAgICAgID0gMiwKKyAgICBNSU1FVFlQRV9WSURFTyAgICAgICA9IDMsCisgICAgTUlNRVRZUEVfTEFTVCAgICAgICAgPSAtMSwKK307CisKK3N0cnVjdCBNaW1lR3JvdXB7CisgICAgaW50ICAgICAgICAgdHlwZTsgICAgIC8vIEF1ZGlvLCB2aWRlbywuLiB1c2UgdGhlIGVudW0gdmFsdWVzCisgICAgY29uc3QgY2hhciogcEdyb3VwOyAgIC8vICJhdWRpby8iLCAidmlkZW8vIiwuLiBzaG91bGQgY29udGFpbiB0aGUgbGFzdCAiLyIKKyAgICBpbnQgICAgICAgICBzaXplOyAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzLiBlLmcuICJhdWRpby8iID0gNiBieXRlcworfTsKKworc3RydWN0IE1pbWVUeXBlTGlzdHsKKyAgICBpbnQgICAgICAgICB0eXBlOworICAgIGNvbnN0IGNoYXIqIHBNaW1lRXh0OyAgLy8gRXZlcnl0aGluZyBhZnRlciB0aGUgJy8nIGUuZy4gYXVkaW8veC1tcGVnIC0+ICJ4LW1wZWciCisgICAgaW50ICAgICAgICAgc2l6ZTsgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMuIGUuZy4gIngtbXBlZyIgPSA2IGJ5dGVzCisgICAgY29uc3QgY2hhciogcE1pbWVUeXBlOyAvLyBNaW1ldHlwZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZAorfTsKKworCisvLyBLbm93biBtaW1ldHlwZXMgYnkgYW5kcm9pZAorc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX21wZWdbXSAgPSAiYXVkaW8vbXBlZyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fM2dwcFtdICA9ICJhdWRpby8zZ3BwIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb19hbXJbXSAgID0gImF1ZGlvL2Ftci13YiI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fYWFjW10gICA9ICJhdWRpby9tcDRhLWxhdG0iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX3dhdltdICAgPSAiYXVkaW8vd2F2IjsKKworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX3ZpZGVvX21wZWc0W10gPSAidmlkZW8vbXBlZzQiOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX3ZpZGVvXzNncHBbXSAgPSAidmlkZW8vM2dwcCI7CisKKy8vIEtub3duIG1pbWV0eXBlIGdyb3Vwcworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF9hdWRpb1tdICAgICAgID0gImF1ZGlvLyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX2dyb3VwX2FwcGxpY2F0aW9uW10gPSAiYXBwbGljYXRpb24vIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfaW1hZ2VbXSAgICAgICA9ICJpbWFnZS8iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF92aWRlb1tdICAgICAgID0gInZpZGVvLyI7CisKK3N0YXRpYyBzdHJ1Y3QgTWltZUdyb3VwIG1pbWVHcm91cFtdID0geworICAgIHtNSU1FVFlQRV9BVURJTywgICAgICAgbWltZV9ncm91cF9hdWRpbywgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX2F1ZGlvKS0xfSwKKyAgICB7TUlNRVRZUEVfQVBQTElDQVRJT04sIG1pbWVfZ3JvdXBfYXBwbGljYXRpb24sICBzaXplb2YobWltZV9ncm91cF9hcHBsaWNhdGlvbiktMX0sCisgICAge01JTUVUWVBFX0lNQUdFLCAgICAgICBtaW1lX2dyb3VwX2ltYWdlLCAgICAgICAgc2l6ZW9mKG1pbWVfZ3JvdXBfaW1hZ2UpLTF9LAorICAgIHtNSU1FVFlQRV9WSURFTywgICAgICAgbWltZV9ncm91cF92aWRlbywgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX3ZpZGVvKS0xfSwKKyAgICB7TUlNRVRZUEVfTEFTVCwgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAwfSAvLyBNdXN0IGJlIGxhc3QgZW50cnkKK307CisKKy8vIExpc3Qgb2YgYWxsIG1pbWV0eXBlcyB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQuCitzdGF0aWMgc3RydWN0IE1pbWVUeXBlTGlzdCBtaW1lVHlwZUxpc3RbXSA9IHsKKyAgICAvLyBNcDMgbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgIm1wMyIsICAgICAgICAgIHNpemVvZigibXAzIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcGVnIiwgICAgICAgc2l6ZW9mKCJ4LW1wZWciKS0xLCAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wMyIsICAgICAgICBzaXplb2YoIngtbXAzIiktMSwgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIm1wZyIsICAgICAgICAgIHNpemVvZigibXBnIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAibXBnMyIsICAgICAgICAgc2l6ZW9mKCJtcGciKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wZyIsICAgICAgICBzaXplb2YoIngtbXBnIiktMSwgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIngtbXBlZ2F1ZGlvIiwgIHNpemVvZigieC1tcGVnYXVkaW8iKS0xLCBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisKKyAgICAvLyAzZ3BwIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICIzZ3AiLCAgICAgICAgICBzaXplb2YoIjNncCIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvXzNncHB9LAorCisgICAgLy8gQW1yIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJhbXIiLCAgICAgICAgICBzaXplb2YoImFtciIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX2Ftcn0sCisKKyAgICAvLyBBYWMgYXVkaW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgImFhYyIsICAgICAgICAgIHNpemVvZigiYWFjIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fYWFjfSwKKworICAgIC8vIFdhdiBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAieC13YXYiLCAgICAgICAgc2l6ZW9mKCJ4LXdhdiIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb193YXZ9LAorCisgICAgLy8gTXBlZzQgdmlkZW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9WSURFTywgIm1wZzQiLCAgICAgICAgIHNpemVvZigibXBnNCIpLTEsICAgICAgICBtaW1lX3R5cGVfdmlkZW9fbXBlZzR9LAorICAgIHtNSU1FVFlQRV9WSURFTywgIm1wNHYtZXMiLCAgICAgIHNpemVvZigibXA0di1lcyIpLTEsICAgICBtaW1lX3R5cGVfdmlkZW9fbXBlZzR9LAorCisgICAgLy8gM2dwcCB2aWRlbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX1ZJREVPLCAiM2dwIiwgICAgICAgICAgc2l6ZW9mKCIzZ3AiKS0xLCAgICAgICAgIG1pbWVfdHlwZV92aWRlb18zZ3BwfSwKKworICAgIC8vIE11c3QgYmUgbGFzdCBlbnRyeQorICAgIHtNSU1FVFlQRV9MQVNULCAgTlVMTCwgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICBOVUxMfQorfTsKKworLyoqCisgKiBNYXkgY29udmVydCB0aGUgbWltZXR5cGUgaWYgdGhlcmUgaXMgYSB3ZWxsIGtub3duCisgKiByZXBsYWNlbWVudCBtaW1ldHlwZSBvdGhlcndpc2UgdGhlIG9yaWdpbmFsIG1pbWV0eXBlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbWltZVR5cGUgLSBtaW1ldHlwZSBpbiBsb3dlciBjYXNlIHRvIGNvbnZlcnQuCisgKgorICogQHJldHVybiBtaW1ldHlwZSBvciBudWxsLgorICovCitTdHJpbmc4IE1pbWVUeXBlVXRpbDo6Y29udmVydE1pbWVUeXBlKFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgU3RyaW5nOCByZXN1bHQgPSBtaW1lVHlwZTsKKyAgICBjb25zdCBjaGFyKiBwVG1wOworICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZTsKKyAgICBzdHJ1Y3QgTWltZUdyb3VwKiBwR3JvdXA7CisgICAgc3RydWN0IE1pbWVUeXBlTGlzdCogcE1pbWVJdGVtOworICAgIGludCBsZW47CisKKyAgICBwTWltZVR5cGUgPSBtaW1lVHlwZS5zdHJpbmcoKTsKKyAgICBpZiAoTlVMTCAhPSBwTWltZVR5cGUpIHsKKyAgICAgICAgLyogQ2hlY2sgd2hpY2ggZ3JvdXAgdGhlIG1pbWV0eXBlIGlzICovCisgICAgICAgIHBHcm91cCA9IG1pbWVHcm91cDsKKworICAgICAgICB3aGlsZSAoTUlNRVRZUEVfTEFTVCAhPSBwR3JvdXAtPnR5cGUpIHsKKyAgICAgICAgICAgIGlmICgwID09IHN0cm5jbXAocE1pbWVUeXBlLCBwR3JvdXAtPnBHcm91cCwgcEdyb3VwLT5zaXplKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEdyb3VwKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBHbyB0aHJvdWdoIHRoZSBtaW1ldHlwZSBsaXN0LiBPbmx5IGNoZWNrIGl0ZW1zIG9mIHRoZSBjb3JyZWN0IGdyb3VwICovCisgICAgICAgIGlmIChNSU1FVFlQRV9MQVNUICE9IHBHcm91cC0+dHlwZSkgeworICAgICAgICAgICAgcE1pbWVJdGVtID0gbWltZVR5cGVMaXN0OworICAgICAgICAgICAgbGVuID0gc3RybGVuIChwTWltZVR5cGUrcEdyb3VwLT5zaXplKTsKKworICAgICAgICAgICAgd2hpbGUgKE1JTUVUWVBFX0xBU1QgIT0gcE1pbWVJdGVtLT50eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKChsZW4gPT0gcE1pbWVJdGVtLT5zaXplKSAmJgorICAgICAgICAgICAgICAgICAgICAoMCA9PSBzdHJjbXAocE1pbWVUeXBlK3BHcm91cC0+c2l6ZSwgcE1pbWVJdGVtLT5wTWltZUV4dCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzgocE1pbWVJdGVtLT5wTWltZVR5cGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcE1pbWVJdGVtKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTE9HSSgiY29udmVydE1pbWVUeXBlIGdvdCBtaW1ldHlwZSAlcywgY29udmVydGVkIGludG8gbWltZXR5cGUgJXMiLAorICAgICAgICAgICAgIHBNaW1lVHlwZSwgcmVzdWx0LnN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorfTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNmYxOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitiYXNlIDo9IGZyYW1ld29ya3MvYmFzZQorCisjIERldGVybWluZSB3aGV0aGVyIHRoZSBEUk0gZnJhbWV3b3JrIHVzZXMgNjQtYml0IGRhdGEgdHlwZXMgZm9yIGZpbGUgb2Zmc2V0cyBhbmQgZG8gdGhlIHNhbWUuCitpZm5lcSAoJChzaGVsbCBncmVwIC1jICdvZmY2NF90IG9mZnNldCcgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oKSwgMCkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV82NEJJVF9EUk1fQVBJCitlbmRpZgorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrZW5naW5lCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmljdWkxOG4gXAorICAgIGxpYmljdXVjIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliZGwgXAorICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYnNzbCBcCisgICAgbGliZHJtZnJhbWV3b3JrCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmRybXV0aWxpdHkgXAorICAgIGxpYmRybWZyYW1ld29ya2NvbW1vbiBcCisgICAgbGliZndkbG9jay1jb21tb24gXAorICAgIGxpYmZ3ZGxvY2stY29udmVydGVyIFwKKyAgICBsaWJmd2Rsb2NrLWRlY29kZXIKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChKTklfSF9JTkNMVURFKSBcCisgICAgJChiYXNlKS9pbmNsdWRlL2RybSBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlciBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyIFwKKyAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvZHJtL3BsdWdpbnMvbmF0aXZlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgwNGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tFTkdJTkVfSF9fCisjZGVmaW5lIF9fRldETE9DS0VOR0lORV9IX18KKworI2luY2x1ZGUgPERybUVuZ2luZUJhc2UuaD4KKyNpbmNsdWRlIDxEcm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPERybVJpZ2h0cy5oPgorI2luY2x1ZGUgPERybUluZm8uaD4KKyNpbmNsdWRlIDxEcm1JbmZvU3RhdHVzLmg+CisjaW5jbHVkZSA8RHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8RHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxEcm1TdXBwb3J0SW5mby5oPgorI2luY2x1ZGUgPERybUluZm9FdmVudC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbk1hcC5oIgorI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBGb3J3YXJkIExvY2sgRW5naW5lIGNsYXNzLgorICovCitjbGFzcyBGd2RMb2NrRW5naW5lIDogcHVibGljIGFuZHJvaWQ6OkRybUVuZ2luZUJhc2UgeworCitwdWJsaWM6CisgICAgRndkTG9ja0VuZ2luZSgpOworICAgIHZpcnR1YWwgfkZ3ZExvY2tFbmdpbmUoKTsKKworcHJvdGVjdGVkOgorLyoqCisgKiBHZXQgY29uc3RyYWludCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9ucyBkZWZpbmVkIHN1Y2ggYXMsCisgKiAgICAgQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YworICogQHJldHVybiBEcm1Db25zdHJhaW50cworICogICAgIGtleS12YWx1ZSBwYWlycyBvZiBjb25zdHJhaW50IGFyZSBlbWJlZGRlZCBpbiBpdAorICogQG5vdGUKKyAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICovCitEcm1Db25zdHJhaW50cyogb25HZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pOworCisvKioKKyAqIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4gRHJtTWV0YWRhdGEKKyAqICAgICAgRm9yIEZvcndhcmQgTG9jayBlbmdpbmUsIGl0IHJldHVybnMgYW4gZW1wdHkgb2JqZWN0CisgKiBAbm90ZQorICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybnMgTlVMTAorICovCitEcm1NZXRhZGF0YSogb25HZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpOworCisvKioKKyAqIEluaXRpYWxpemUgcGx1Zy1pbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvCisgKiByZWNlaXZlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGluZm9MaXN0ZW5lciBMaXN0ZW5lcgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcik7CisKKy8qKgorICogVGVybWluYXRlIHRoZSBwbHVnLWluIGFuZCByZWxlYXNlIHJlc291cmNlcyBib3VuZCB0byBpdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpOworCisvKioKKyAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGNhbiBiZSBoYW5kbGVkIGJ5IHRoaXMgcGx1Z2luIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgcHJvdGVjdGVkIG9iamVjdAorICogQHJldHVybiBib29sCisgKiAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHBsdWdpbiBjYW4gaGFuZGxlICwgZmFsc2UgaW4gY2FzZSBvZiBub3QgYWJsZSB0byBoYW5kbGUKKyAqLworYm9vbCBvbkNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisvKioKKyAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gRFJNIGluZm9ybWF0aW9uIGFzIGFwcHJvcHJpYXRlIGZvciBpdHMgdHlwZS4KKyAqIE5vdCB1c2VkIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZHJtSW5mbyBJbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICogQHJldHVybiBEcm1JbmZvU3RhdHVzCisgKiAgICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAqLworRHJtSW5mb1N0YXR1cyogb25Qcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisvKioKKyAqIFNhdmUgRFJNIHJpZ2h0cyB0byBzcGVjaWZpZWQgcmlnaHRzIHBhdGgKKyAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICogQHBhcmFtIHJpZ2h0c1BhdGggRmlsZSBwYXRoIHdoZXJlIHJpZ2h0cyB0byBiZSBzYXZlZAorICogQHBhcmFtIGNvbnRlbnRQYXRoIEZpbGUgcGF0aCB3aGVyZSBjb250ZW50IHdhcyBzYXZlZAorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisvKioKKyAqIFJldHJpZXZlcyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHJlZ2lzdHJhdGlvbiwgdW5yZWdpc3RyYXRpb24gb3IgcmlnaHRzCisgKiBhY3F1aXNpdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybUluZm9SZXF1ZXN0IFJlcXVlc3QgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgZHJtSW5mbworICogQHJldHVybiBEcm1JbmZvCisgKiAgICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAqLworRHJtSW5mbyogb25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKy8qKgorICogUmV0cmlldmVzIHRoZSBtaW1lIHR5cGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHJldHVybiBTdHJpbmc4CisgKiAgICAgICBSZXR1cm5zIG1pbWUtdHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAqLworU3RyaW5nOCBvbkdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworLyoqCisgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgKiB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAqIHRvIHJldHJpZXZlIERSTSBvYmplY3QgdHlwZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBvciBudWxsLgorICogQHBhcmFtIG1pbWVUeXBlIE1pbWUgdHlwZSBvZiB0aGUgY29udGVudCBvciBudWxsLgorICogQHJldHVybiB0eXBlIG9mIHRoZSBEUk0gY29udGVudCwKKyAqICAgICBzdWNoIGFzIERybU9iamVjdFR5cGU6OkNPTlRFTlQsIERybU9iamVjdFR5cGU6OlJJR0hUU19PQkpFQ1QKKyAqLworaW50IG9uR2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworLyoqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybSAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgKiAgICAgc3VjaCBhcyBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCwgUmlnaHRzU3RhdHVzOjpSSUdIVFNfRVhQSVJFRCwgZXRjLgorICovCitpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbik7CisKKy8qKgorICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgorICogSWYgdGhlIHJlc2VydmUgcGFyYW1ldGVyIGlzIHRydWUgdGhlIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQgdW50aWwgdGhlIHNhbWUKKyAqIGFwcGxpY2F0aW9uIGNhbGxzIHRoaXMgYXBpIGFnYWluIHdpdGggdGhlIHJlc2VydmUgcGFyYW1ldGVyIHNldCB0byBmYWxzZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtLiAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAqIEBwYXJhbSByZXNlcnZlIFRydWUgaWYgdGhlIHJpZ2h0cyBzaG91bGQgYmUgcmVzZXJ2ZWQuCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CisKKy8qKgorICogSW5mb3JtcyB0aGUgRFJNIEVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gcGxheWJhY2tTdGF0dXMgUGxheWJhY2sgYWN0aW9uIChQbGF5YmFjazo6U1RBUlQsIFBsYXliYWNrOjpTVE9QLCBQbGF5YmFjazo6UEFVU0UpCisgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gaW4gdGhlIGZpbGUgKGluIG1pbGxpc2Vjb25kcykgd2hlcmUgdGhlIHN0YXJ0IG9jY3Vycy4KKyAqICAgICBPbmx5IHZhbGlkIHRvZ2V0aGVyIHdpdGggUGxheWJhY2s6OlNUQVJULgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pOworI2Vsc2UKK3N0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CisjZW5kaWYKKworLyoqCisgKiAgVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHZhbGlkYXRlIChBY3Rpb246OlBMQVksIEFjdGlvbjo6VFJBTlNGRVIsIGV0YykKKyAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBpcyBhbGxvd2VkLgorICovCitib29sIG9uVmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisvKioKKyAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50LgorICogTm90IHVzZWQgZm9yIEZvcndhcmQgTG9jayBFbmdpbmUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKy8qKgorICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCisgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0IGJ1dCBkb2VzIG5vdGhpbmcgZm9yCisgKiBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogU3RhcnRzIHRoZSBGb3J3YXJkIExvY2sgZmlsZSBjb252ZXJzaW9uIHNlc3Npb24uCisgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgKiB3aGljaCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyB0bworICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLiBUaGUgY29udmVydElkIGlzIHVzZWQgYXMgdGhlIGNvbnZlcnNpb24gc2Vzc2lvbiBrZXkKKyAqIGFuZCBtdXN0IG5vdCBiZSB0aGUgc2FtZSBmb3IgZGlmZmVyZW50IGNvbnZlcnQgc2Vzc2lvbnMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKy8qKgorICogQWNjZXB0cyBhbmQgY29udmVydHMgdGhlIGlucHV0IGRhdGEgd2hpY2ggaXMgcGFydCBvZiBEUk0gZmlsZS4KKyAqIFRoZSByZXN1bHRhbnQgY29udmVydGVkIGRhdGEgYW5kIHRoZSBzdGF0dXMgaXMgcmV0dXJuZWQgaW4gdGhlIERybUNvbnZlcnRlZEluZm8KKyAqIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGlzIGEgbmV3IGJsb2NrCisgKiBvZiBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAqIEBwYXJhbSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAqICAgICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICogICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICovCitEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ29udmVydERhdGEoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb252ZXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisvKioKKyAqIENsb3NlcyB0aGUgY29udmVydCBzZXNzaW9uIGluIGNhc2Ugb2YgZGF0YSBzdXBwbHkgY29tcGxldGVkIG9yIGVycm9yIG9jY3VycmVkLgorICogVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsIGl0IHJldHVybnMgc2lnbmF0dXJlIGNhbGN1bGF0ZWQgb3ZlcgorICogdGhlIGVudGlyZSBkYXRhIHVzZWQgb3ZlciBhIGNvbnZlcnNpb24gc2Vzc2lvbi4gVGhpcyBzaWduYXR1cmUgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIG9mZnNldAorICogbWVudGlvbmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRTdGF0dXMuIFNpZ25hdHVyZSBpcyB1c2VkIGZvciBkYXRhIGludGVncml0eSBwcm90ZWN0aW9uLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAqICAgICAgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgZGF0YS4gSXQgYWxzbyBpbmZvcm1zCisgKiAgICAgIHRoZSBhcHBsaWNhdGlvbiBhYm91dCB0aGUgZmlsZSBvZmZzZXQgYXQgd2hpY2ggdGhpcworICogICAgICBzaWduYXR1cmUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4KKyAqLworRHJtQ29udmVydGVkU3RhdHVzKiBvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRHJtIEVuZ2luZSBjYXBhYmlsaXRpZXMgd2hpY2ggaW5jbHVkZXMKKyAqIHN1cHBvcnRlZCBNaW1lVHlwZXMgYW5kIGZpbGUgc3VmZml4ZXMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gRHJtU3VwcG9ydEluZm8KKyAqICAgICAgaW5zdGFuY2Ugd2hpY2ggaG9sZHMgdGhlIGNhcGFiaWxpdGllcyBvZiBhIHBsdWctaW4KKyAqLworRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZmQgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAqIEBwYXJhbSBvZmZzZXQgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnRlbnQKKyAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4KKyAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCisgKi8KKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKyNlbHNlCitzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCisvKioKKyAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgY3VycmVudCBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEBwYXJhbSB1cmkgUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCitzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKTsKKworLyoqCisgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworLyoqCisgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gaGVhZGVySW5mbyBJbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGRlY3J5cHRpb24gb2YgdGhpcyBkZWNyeXBVbml0CisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCitzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworCisvKioKKyAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0LgorICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgKiBlbmNyeXB0ZWQgc3RyZWFtcyByZWNlaXZlZCBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAqIEBwYXJhbSBlbmNCdWZmZXIgRW5jcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEBwYXJhbSBkZWNCdWZmZXIgRGVjcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGlzIEFQSQorICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAorICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgorICovCitzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyKTsKKworLyoqCisgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdC4KKyAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRJZCBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0VW5pdElkIElEIFNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAqIEBwYXJhbSBlbmNCdWZmZXIgRW5jcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEBwYXJhbSBkZWNCdWZmZXIgRGVjcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEBwYXJhbSBJViBPcHRpb25hbCBidWZmZXIKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGlzIEFQSQorICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAorICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgorICovCitzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisvKioKKyAqIEZpbmFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCitzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOworCisvKioKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gYnVmZmVyIFJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitzc2l6ZV90IG9uUmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgIGludCBudW1CeXRlcyk7CisKKy8qKgorICogVXBkYXRlcyB0aGUgZmlsZSBwb3NpdGlvbiB3aXRoaW4gYW4gb3BlbiBEUk0gZmlsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqIEBwYXJhbSB3aGVuY2UgT25lIG9mIFNFRUtfU0VULCBTRUVLX0NVUiwgYW5kIFNFRUtfRU5ELgorICogICAgICAgICAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB1bmlzdGQuaC4KKyAqCisgKiBAcmV0dXJuIE5ldyBmaWxlIHBvc2l0aW9uLgorICogQHJldHZhbCAoKG9mZl90KS0xKSBGYWlsdXJlLgorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK29mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKKyNlbHNlCitvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKKyNlbmRpZgorCisvKioKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gYnVmZmVyIFJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICoKKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCisgKi8KKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKKyNlbHNlCitzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKKyNlbmRpZgorCitwcml2YXRlOgorCisvKioKKyAqIFNlc3Npb24gQ2xhc3MgZm9yIEZvcndhcmQgTG9jayBDb252ZXJzaW9uLiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkCisgKiBmb3IgZXZlcnkgY29udmVyc2lvbi4KKyAqLworY2xhc3MgQ29udmVydFNlc3Npb24geworICAgIHB1YmxpYyA6CisgICAgICAgIGludCB1bmlxdWVJZDsKKyAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3Qgb3V0cHV0OworCisgICAgICAgIENvbnZlcnRTZXNzaW9uKCkgeworICAgICAgICAgICAgdW5pcXVlSWQgPSAwOworICAgICAgICAgICAgbWVtc2V0KCZvdXRwdXQsIDAsIHNpemVvZihGd2RMb2NrQ29udl9PdXRwdXRfdCkpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+Q29udmVydFNlc3Npb24oKSB7fQorfTsKKworLyoqCisgKiBTZXNzaW9uIENsYXNzIGZvciBGb3J3YXJkIExvY2sgZGVjb2Rlci4gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogZm9yIGV2ZXJ5IGRlY29kaW5nIHNlc3Npb24uCisgKi8KK2NsYXNzIERlY29kZVNlc3Npb24geworICAgIHB1YmxpYyA6CisgICAgICAgIGludCBmaWxlRGVzYzsKKyAgICAgICAgb2ZmX3Qgb2Zmc2V0OworCisgICAgICAgIERlY29kZVNlc3Npb24oKSB7CisgICAgICAgICAgICBmaWxlRGVzYyA9IC0xOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIERlY29kZVNlc3Npb24oaW50IGZkKSB7CisgICAgICAgICAgICBmaWxlRGVzYyA9IGZkOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkRlY29kZVNlc3Npb24oKSB7fQorfTsKKworLyoqCisgKiBTZXNzaW9uIE1hcCBUYWJsZXMgZm9yIENvbnZlcnNpb24gYW5kIERlY29kaW5nIG9mIGZvcndhcmQgbG9jayBmaWxlcy4KKyAqLworU2Vzc2lvbk1hcDxDb252ZXJ0U2Vzc2lvbio+IGNvbnZlcnRTZXNzaW9uTWFwOworU2Vzc2lvbk1hcDxEZWNvZGVTZXNzaW9uKj4gZGVjb2RlU2Vzc2lvbk1hcDsKKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZXJyb3IgY29kZSBmcm9tIEZvcndhcmQgTG9jayBDb252ZXJ0ZXIgdG8gRHJtQ29udmVydFN0YXR1cyBlcnJvciBjb2RlLgorICoKKyAqIEBwYXJhbSBGb3J3YXJkIExvY2sgQ29udmVydGVyIGVycm9yIGNvZGUKKyAqCisgKiBAcmV0dXJuIFN0YXR1cyBjb2RlIGZyb20gRHJtQ29udmVydFN0YXR1cy4KKyAqLworc3RhdGljIGludCBnZXRDb252ZXJ0ZWRTdGF0dXMoRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzKTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0ZXRExPQ0tFTkdJTkVfSF9fICovCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmVDb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTVkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tFTkdJTkVDT05TVF9IX18KKyNkZWZpbmUgX19GV0RMT0NLRU5HSU5FQ09OU1RfSF9fCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIGZvcndhcmQgTG9jayBFbmdpbmUgdXNlZCBmb3IgZXhwb3NpbmcgZW5naW5lJ3MgY2FwYWJpbGl0aWVzLgorICovCisjZGVmaW5lIEZXRExPQ0tfRVhURU5TSU9OX0ZMICAgICAgICAgICAoIkZMIikKKyNkZWZpbmUgRldETE9DS19ET1RFWFRFTlNJT05fRkwgICAgICAgICgiLmZsIikKKyNkZWZpbmUgRldETE9DS19NSU1FVFlQRV9GTCAgICAgICAgICAgICgiYXBwbGljYXRpb24veC1hbmRyb2lkLWRybS1mbCIpCisKKyNkZWZpbmUgRldETE9DS19FWFRFTlNJT05fRE0gICAgICAgICAgICgiRE0iKQorI2RlZmluZSBGV0RMT0NLX0RPVEVYVEVOU0lPTl9ETSAgICAgICAgKCIuZG0iKQorI2RlZmluZSBGV0RMT0NLX01JTUVUWVBFX0RNICAgICAgICAgICAgKCJhcHBsaWNhdGlvbi92bmQub21hLmRybS5tZXNzYWdlIikKKworI2RlZmluZSBGV0RMT0NLX0RFU0NSSVBUSU9OICAgICAgICAgICAgKCJPTUEgVjEgRm9yd2FyZCBMb2NrIikKKworfTsKKworI2VuZGlmIC8qIF9fRldETE9DS0VOR0lORUNPTlNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzMGY3MgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2Vzc2lvbk1hcC5oIgorI2luY2x1ZGUgIkZ3ZExvY2tFbmdpbmUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPERybVJpZ2h0cy5oPgorI2luY2x1ZGUgPERybUNvbnN0cmFpbnRzLmg+CisjaW5jbHVkZSA8RHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxEcm1JbmZvLmg+CisjaW5jbHVkZSA8RHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPERybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8RHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAiRndkTG9ja0NvbnYuaCIKKyNpbmNsdWRlICJGd2RMb2NrRmlsZS5oIgorI2luY2x1ZGUgIkZ3ZExvY2tHbHVlLmgiCisjaW5jbHVkZSAiRndkTG9ja0VuZ2luZUNvbnN0LmgiCisjaW5jbHVkZSAiTWltZVR5cGVVdGlsLmgiCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkZ3ZExvY2tFbmdpbmUiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworLy8gVGhpcyBleHRlcm4gIkMiIGlzIG1hbmRhdG9yeSB0byBiZSBtYW5hZ2VkIGJ5IFRQbHVnSW5NYW5hZ2VyCitleHRlcm4gIkMiIElEcm1FbmdpbmUqIGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IEZ3ZExvY2tFbmdpbmUoKTsKK30KKworLy8gVGhpcyBleHRlcm4gIkMiIGlzIG1hbmRhdG9yeSB0byBiZSBtYW5hZ2VkIGJ5IFRQbHVnSW5NYW5hZ2VyCitleHRlcm4gIkMiIHZvaWQgZGVzdHJveShJRHJtRW5naW5lKiBwbHVnSW4pIHsKKyAgICBkZWxldGUgcGx1Z0luOworfQorCitGd2RMb2NrRW5naW5lOjpGd2RMb2NrRW5naW5lKCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgQ29uc3RydWN0aW9uIik7Cit9CisKK0Z3ZExvY2tFbmdpbmU6On5Gd2RMb2NrRW5naW5lKCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgRGVzdHJ1Y3Rpb24iKTsKKworICAgIGNvbnZlcnRTZXNzaW9uTWFwLmRlc3Ryb3lNYXAoKTsKKyAgICBkZWNvZGVTZXNzaW9uTWFwLmRlc3Ryb3lNYXAoKTsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6OmdldENvbnZlcnRlZFN0YXR1cyhGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBpbnQgcmV0U3RhdHVzID0gRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfRVJST1I7CisKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX09LOgorICAgICAgICAgICAgcmV0U3RhdHVzID0gRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I6CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDoKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0OgorICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOgorICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZSBnZXRDb252ZXJ0ZWRTdGF0dXM6IGZpbGUgY29udmVyc2lvbiBFcnJvciAlZC4gIiBcCisgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nIFNUQVRVU19JTlBVVERBVEFfRVJST1IiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0U3RhdHVzID0gRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfSU5QVVREQVRBX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lIGdldENvbnZlcnRlZFN0YXR1czogZmlsZSBjb252ZXJzaW9uIEVycm9yICVkLiAiIFwKKyAgICAgICAgICAgICAgICAgICJSZXR1cm5pbmcgU1RBVFVTX0VSUk9SIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldFN0YXR1czsKK30KKworRHJtQ29uc3RyYWludHMqIEZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzID0gTlVMTDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMiKTsKKworICAgIGlmIChOVUxMICE9IHBhdGggJiYKKyAgICAgICAgKFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEID09IG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsICpwYXRoLCBhY3Rpb24pKSkgeworICAgICAgICAvLyBSZXR1cm4gdGhlIGVtcHR5IGNvbnN0cmFpbnRzIHRvIHNob3cgbm8gZXJyb3IgY29uZGl0aW9uLgorICAgICAgICBkcm1Db25zdHJhaW50cyA9IG5ldyBEcm1Db25zdHJhaW50cygpOworICAgIH0KKworICAgIHJldHVybiBkcm1Db25zdHJhaW50czsKK30KKworRHJtTWV0YWRhdGEqIEZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgRHJtTWV0YWRhdGEqIGRybU1ldGFkYXRhID0gTlVMTDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEiKTsKKworICAgIGlmIChOVUxMICE9IHBhdGgpIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBtZXRhZGF0YSB0byBzaG93IG5vIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgZHJtTWV0YWRhdGEgPSBuZXcgRHJtTWV0YWRhdGEoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtTWV0YWRhdGE7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUiKTsKKworCisgICAgaWYgKEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkpIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIC0tIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uIHN1Y2NlZWRlZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBmYWlsZWQ6IgorICAgICAgICAgICAgICJlcnJubyA9ICVkIiwgZXJybm8pOworICAgIH0KKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190CitGd2RMb2NrRW5naW5lOjpvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcikgeworICAgIC8vIE5vdCB1c2VkCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lciIpOworCisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUiKTsKKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK0RybVN1cHBvcnRJbmZvKiBGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCkgeworICAgIERybVN1cHBvcnRJbmZvKiBwU3VwcG9ydEluZm8gPSBuZXcgRHJtU3VwcG9ydEluZm8oKTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0U3VwcG9ydEluZm8iKTsKKworICAgIC8vIGZpbGwgYWxsIEZvcndhcmQgTG9jayBtaW1ldHlwZXMgYW5kIGV4dGVuc2lvbnMKKyAgICBpZiAoTlVMTCAhPSBwU3VwcG9ydEluZm8pIHsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRNaW1lVHlwZShTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRkwpKTsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRGaWxlU3VmZml4KFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRkwpKTsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRNaW1lVHlwZShTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRE0pKTsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRGaWxlU3VmZml4KFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRE0pKTsKKworICAgICAgICBwU3VwcG9ydEluZm8tPnNldERlc2NyaXB0aW9uKFN0cmluZzgoRldETE9DS19ERVNDUklQVElPTikpOworICAgIH0KKworICAgIHJldHVybiBwU3VwcG9ydEluZm87Cit9CisKK2Jvb2wgRndkTG9ja0VuZ2luZTo6b25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIFN0cmluZzggZXh0U3RyaW5nID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CisKKyAgICBleHRTdHJpbmcudG9Mb3dlcigpOworCisgICAgaWYgKChleHRTdHJpbmcgPT0gU3RyaW5nOChGV0RMT0NLX0RPVEVYVEVOU0lPTl9GTCkpIHx8CisgICAgICAgIChleHRTdHJpbmcgPT0gU3RyaW5nOChGV0RMT0NLX0RPVEVYVEVOU0lPTl9ETSkpKSB7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUluZm9TdGF0dXMqIEZ3ZExvY2tFbmdpbmU6Om9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgRHJtSW5mb1N0YXR1cyAqZHJtSW5mb1N0YXR1cyA9IE5VTEw7CisKKyAgICAvLyBOb3RoaW5nIHRvIHByb2Nlc3MKKworICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cygoaW50KURybUluZm9TdGF0dXM6OlNUQVRVU19PSywgMCwgTlVMTCwgU3RyaW5nOCgiIikpOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Qcm9jZXNzRHJtSW5mbyIpOworCisgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgLy8gTm8gcmlnaHRzIHRvIHNhdmUuIFJldHVybgorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uU2F2ZVJpZ2h0cyIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworRHJtSW5mbyogRndkTG9ja0VuZ2luZTo6b25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOworCisgICAgLy8gTm90aGluZyB0byBiZSBkb25lIGZvciBGb3J3YXJkIExvY2sgZmlsZQorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQWNxdWlyZURybUluZm8iKTsKKworICAgIHJldHVybiBkcm1JbmZvOworfQorCitpbnQgRndkTG9ja0VuZ2luZTo6b25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbikgeworICAgIGludCByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DaGVja1JpZ2h0c1N0YXR1cyIpOworCisgICAgLy8gT25seSBUcmFuc2ZlciBhY3Rpb24gaXMgbm90IGFsbG93ZWQgZm9yIGZvcndhcmQgTG9jayBmaWxlcy4KKyAgICBpZiAob25DYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpKSB7CisgICAgICAgIHN3aXRjaChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpERUZBVUxUOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlBMQVk6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6UklOR1RPTkU6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6T1VUUFVUOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlBSRVZJRVc6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6RVhFQ1VURToKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpESVNQTEFZOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6VFJBTlNGRVI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJpZ2h0c1N0YXR1czo6UklHSFRTX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpIHsKKyAgICAvLyBObyByaWdodHMgY29uc3VtcHRpb24KKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitib29sIEZ3ZExvY2tFbmdpbmU6Om9uVmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblZhbGlkYXRlQWN0aW9uIik7CisKKyAgICAvLyBGb3IgdGhlIGZvcndhcmRsb2NrIGVuZ2luZSBjaGVja1JpZ2h0cyBhbmQgVmFsaWRhdGVBY3Rpb24gYXJlIHRoZSBzYW1lLgorICAgIHJldHVybiAob25DaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKSA9PSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCk7Cit9CisKK1N0cmluZzggRndkTG9ja0VuZ2luZTo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0T3JpZ2luYWxNaW1lVHlwZSIpOworICAgIFN0cmluZzggbWltZVN0cmluZyA9IFN0cmluZzgoIiIpOworICAgIGludCBmaWxlRGVzYyA9IEZ3ZExvY2tGaWxlX29wZW4ocGF0aC5zdHJpbmcoKSk7CisKKyAgICBpZiAoLTEgPCBmaWxlRGVzYykgeworICAgICAgICBjb25zdCBjaGFyKiBwTWltZVR5cGUgPSBGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShmaWxlRGVzYyk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gcE1pbWVUeXBlKSB7CisgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlID0gU3RyaW5nOChwTWltZVR5cGUpOworICAgICAgICAgICAgY29udGVudFR5cGUudG9Mb3dlcigpOworICAgICAgICAgICAgbWltZVN0cmluZyA9IE1pbWVUeXBlVXRpbDo6Y29udmVydE1pbWVUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEZ3ZExvY2tGaWxlX2Nsb3NlKGZpbGVEZXNjKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVN0cmluZzsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6Om9uR2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgU3RyaW5nOCBtaW1lU3RyID0gU3RyaW5nOChtaW1lVHlwZSk7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUiKTsKKworICAgIG1pbWVTdHIudG9Mb3dlcigpOworCisgICAgLyogQ2hlY2tzIHdoZXRoZXIKKyAgICAqIDEuIHBhdGggYW5kIG1pbWUgdHlwZSBib3RoIGFyZSBub3QgZW1wdHkgc3RyaW5ncyAobWVhbmluZyB1bmF2YWlsYWJsZSkgZWxzZSBjb250ZW50IGlzIHVua25vd24KKyAgICAqIDIuIGlmIG9uZSBvZiB0aGVtIGlzIGVtcHR5IHN0cmluZyBhbmQgaWYgb3RoZXIgaXMga25vd24gdGhlbiBpdHMgYSBEUk0gQ29udGVudCBPYmplY3QuCisgICAgKiAzLiBpZiBib3RoIG9mIHRoZW0gYXJlIGF2YWlsYWJsZSwgdGhlbiBib3RoIG1heSBiZSBvZiBrbm93biB0eXBlCisgICAgKiAgICAocmVnYXJkbGVzcyBvZiB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGVtIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIG90aGVyIERSTSBFbmdpbmVzKQorICAgICovCisgICAgaWYgKCgoMCA9PSBwYXRoLmxlbmd0aCgpKSB8fCBvbkNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCkpICYmCisgICAgICAgICgoMCA9PSBtaW1lVHlwZS5sZW5ndGgoKSkgfHwgKChtaW1lU3RyID09IFN0cmluZzgoRldETE9DS19NSU1FVFlQRV9GTCkpIHx8CisgICAgICAgIChtaW1lU3RyID09IFN0cmluZzgoRldETE9DS19NSU1FVFlQRV9ETSkpKSkgJiYgKG1pbWVUeXBlICE9IHBhdGgpICkgeworICAgICAgICAgICAgcmV0dXJuIERybU9iamVjdFR5cGU6OkNPTlRFTlQ7CisgICAgfQorCisgICAgcmV0dXJuIERybU9iamVjdFR5cGU6OlVOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIC8vIE5vIFJpZ2h0cyB0byByZW1vdmUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIC8vIE5vIHJpZ2h0cyB0byByZW1vdmUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZUFsbFJpZ2h0cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworI2Vsc2UKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworI2VuZGlmCisgICAgLy8gTm90IHVzZWQKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzIik7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24iKTsKKyAgICBpZiAoIWNvbnZlcnRTZXNzaW9uTWFwLmlzQ3JlYXRlZChjb252ZXJ0SWQpKSB7CisgICAgICAgIENvbnZlcnRTZXNzaW9uICpuZXdTZXNzaW9uID0gbmV3IENvbnZlcnRTZXNzaW9uKCk7CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9TdGF0dXNfT0sgPT0KKyAgICAgICAgICAgIEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKCYobmV3U2Vzc2lvbi0+dW5pcXVlSWQpLCAmKG5ld1Nlc3Npb24tPm91dHB1dCkpKSB7CisgICAgICAgICAgICBjb252ZXJ0U2Vzc2lvbk1hcC5hZGRWYWx1ZShjb252ZXJ0SWQsIG5ld1Nlc3Npb24pOworICAgICAgICAgICAgcmVzdWx0ID0gRFJNX05PX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24gLS0gRndkTG9ja0NvbnZfT3BlblNlc3Npb24gZmFpbGVkLiIpOworICAgICAgICAgICAgZGVsZXRlIG5ld1Nlc3Npb247CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvbkNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3QgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICBEcm1CdWZmZXIgKmNvbnZSZXN1bHQgPSBuZXcgRHJtQnVmZmVyKE5VTEwsIDApOworICAgIGludCBvZmZzZXQgPSAtMTsKKworICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSAmJiBjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqY29udlNlc3Npb24gPSBjb252ZXJ0U2Vzc2lvbk1hcC5nZXRWYWx1ZShjb252ZXJ0SWQpOworCisgICAgICAgIGlmIChOVUxMICE9IGNvbnZTZXNzaW9uKSB7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShjb252U2Vzc2lvbi0+dW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoY29udlNlc3Npb24tPm91dHB1dCkpOworCisgICAgICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09IHJldFN0YXR1cykgeworICAgICAgICAgICAgICAgIC8vIHJldHVybiBieXRlcyBmcm9tIGNvbnZlcnNpb24gaWYgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYgKGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5kYXRhID0gbmV3IGNoYXJbY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXNdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGNvbnZSZXN1bHQtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCA9IGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvbnZSZXN1bHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiljb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKGdldENvbnZlcnRlZFN0YXR1cyhyZXRTdGF0dXMpLCBjb252UmVzdWx0LCBvZmZzZXQpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3QgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICBEcm1CdWZmZXIgKmNvbnZSZXN1bHQgPSBuZXcgRHJtQnVmZmVyKE5VTEwsIDApOworICAgIGludCBvZmZzZXQgPSAtMTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbiIpOworCisgICAgaWYgKGNvbnZlcnRTZXNzaW9uTWFwLmlzQ3JlYXRlZChjb252ZXJ0SWQpKSB7CisgICAgICAgIENvbnZlcnRTZXNzaW9uICpjb252U2Vzc2lvbiA9IGNvbnZlcnRTZXNzaW9uTWFwLmdldFZhbHVlKGNvbnZlcnRJZCk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gY29udlNlc3Npb24pIHsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihjb252U2Vzc2lvbi0+dW5pcXVlSWQsICYoY29udlNlc3Npb24tPm91dHB1dCkpOworCisgICAgICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09IHJldFN0YXR1cykgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5maWxlT2Zmc2V0OworICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmRhdGEgPSBuZXcgY2hhcltGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkVdOworCisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gY29udlJlc3VsdC0+ZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCA9IEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29udlJlc3VsdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiljb252U2Vzc2lvbi0+b3V0cHV0LmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJlc3VsdC0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udmVydFNlc3Npb25NYXAucmVtb3ZlVmFsdWUoY29udmVydElkKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBEcm1Db252ZXJ0ZWRTdGF0dXMoZ2V0Q29udmVydGVkU3RhdHVzKHJldFN0YXR1cyksIGNvbnZSZXN1bHQsIG9mZnNldCk7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBsZW5ndGgpIHsKKyNlbHNlCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKyNlbmRpZgorICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIGludCBmaWxlRGVzYyA9IC0xOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24iKTsKKworICAgIGlmICgoLTEgPCBmZCkgJiYKKyAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICAgICAgKCFkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgeworICAgICAgICBmaWxlRGVzYyA9IGR1cChmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gcGFyYW1ldGVyIGVycm9yIik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKC0xIDwgZmlsZURlc2MgJiYKKyAgICAgICAgLTEgPCA6OmxzZWVrKGZpbGVEZXNjLCBvZmZzZXQsIFNFRUtfU0VUKSAmJgorICAgICAgICAtMSA8IEZ3ZExvY2tGaWxlX2F0dGFjaChmaWxlRGVzYykpIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIGZpbGUgaW50ZWdyaXR5LiBUaGlzIG11c3QgYmUgZG9uZSB0byBwcm90ZWN0IHRoZSBjb250ZW50IG1hbmdsaW5nLgorICAgICAgICBpbnQgcmV0VmFsID0gRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoZmlsZURlc2MpOworICAgICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVTZXNzaW9uID0gbmV3IERlY29kZVNlc3Npb24oZmlsZURlc2MpOworCisgICAgICAgIGlmIChyZXRWYWwgJiYgTlVMTCAhPSBkZWNvZGVTZXNzaW9uKSB7CisgICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmFkZFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCwgZGVjb2RlU2Vzc2lvbik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwbWltZT0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IFN0cmluZzgocG1pbWUgPT0gTlVMTCA/ICIiIDogcG1pbWUpOworICAgICAgICAgICAgY29udGVudFR5cGUudG9Mb3dlcigpOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUgPSBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShjb250ZW50VHlwZSk7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9IERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQ7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5zdGF0dXMgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRDsKKyAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIEludGVncml0eSBDaGVjayBmYWlsZWQgZm9yIHRoZSBmZCIpOworICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmlsZURlc2MpOworICAgICAgICAgICAgZGVsZXRlIGRlY29kZVNlc3Npb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBFeGl0LiByZXN1bHQgPSAlZCIsIHJlc3VsdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgICAgICBTdHJpbmc4IHVyaVRhZyA9IFN0cmluZzgodXJpKTsKKyAgICAgICAgdXJpVGFnLnRvTG93ZXIoKTsKKworICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHVyaVRhZy5zdHJpbmcoKSwgZmlsZVRhZywgc2l6ZW9mKGZpbGVUYWcpIC0gMSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVQYXRoID0gc3RyY2hyKHVyaSArIHNpemVvZihmaWxlVGFnKSAtIDEsICcvJyk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBmaWxlUGF0aCAmJiBvbkNhbkhhbmRsZSh1bmlxdWVJZCwgU3RyaW5nOChmaWxlUGF0aCkpKSB7CisgICAgICAgICAgICAgICAgaW50IGZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworCisgICAgICAgICAgICAgICAgaWYgKC0xIDwgZmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGlzIGFsd2F5cyAwIGFuZCBsZW5ndGggaXMgbm90IHVzZWQuIHNvIGFueSBwb3NpdGl2ZSBzaXplLgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZmQsIDAsIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZkIGlzIGR1cGxpY2F0ZWQgYWxyZWFkeSBpZiBzdWNjZXNzLiBjbG9zaW5nIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24iKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgeworICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChzZXNzaW9uLT5maWxlRGVzYyk7CisgICAgICAgICAgICA6OmNsb3NlKHNlc3Npb24tPmZpbGVEZXNjKTsKKyAgICAgICAgICAgIGRlY29kZVNlc3Npb25NYXAucmVtb3ZlVmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiBFeGl0Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcikgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOworfQorCitzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzKSB7CisgICAgc3NpemVfdCBzaXplID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmCisgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgorICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgorICAgICAgICBudW1CeXRlcyA+IC0xKSB7CisgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgeworICAgICAgICAgICAgc2l6ZSA9IEZ3ZExvY2tGaWxlX3JlYWQoc2Vzc2lvbi0+ZmlsZURlc2MsIGJ1ZmZlciwgbnVtQnl0ZXMpOworCisgICAgICAgICAgICBpZiAoMCA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5vZmZzZXQgPSAoKG9mZl90KS0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CisjZWxzZQorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgeworI2VuZGlmCisgICAgb2ZmX3Qgb2ZmdmFsID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CisgICAgICAgICAgICBvZmZ2YWwgPSBGd2RMb2NrRmlsZV9sc2VlayhzZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOworICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ID0gb2ZmdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnZhbDsKK30KKworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyNlbHNlCitzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CisjZW5kaWYKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IC0xOworCisgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlclNlc3Npb24gPSBOVUxMOworCisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgIChOVUxMICE9IChkZWNvZGVyU2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpICYmCisgICAgICAgIChOVUxMICE9IGJ1ZmZlcikgJiYKKyAgICAgICAgKG51bUJ5dGVzID4gLTEpICYmCisgICAgICAgIChvZmZzZXQgPiAtMSkpIHsKKyAgICAgICAgaWYgKG9mZnNldCAhPSBkZWNvZGVyU2Vzc2lvbi0+b2Zmc2V0KSB7CisgICAgICAgICAgICBkZWNvZGVyU2Vzc2lvbi0+b2Zmc2V0ID0gb25Mc2Vlayh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChvZmZfdCktMSkgIT0gZGVjb2RlclNlc3Npb24tPm9mZnNldCkgeworICAgICAgICAgICAgYnl0ZXNSZWFkID0gb25SZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25QcmVhZCBlcnJvciByZWFkaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblByZWFkIGRlY3J5cHRJZCBub3QgZm91bmQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVkM2NmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgRndkTG9ja0dsdWUuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjcnlwdG8KKworTE9DQUxfTU9EVUxFIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5jIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZGE4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tHbHVlLmgiCisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBLRVlfU0laRSAxNgorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKK3N0YXRpYyBpbnQgaXNJbml0aWFsaXplZCA9IEZBTFNFOworCitzdGF0aWMgY29uc3QgY2hhciBzdHJLZXlGaWxlbmFtZVtdID0gIi9kYXRhL2RybS9md2Rsb2NrL2tlay5kYXQiOworCitzdGF0aWMgQUVTX0tFWSBlbmNyeXB0aW9uUm91bmRLZXlzOworc3RhdGljIEFFU19LRVkgZGVjcnlwdGlvblJvdW5kS2V5czsKKworLyoqCisgKiBDcmVhdGVzIGFsbCBkaXJlY3RvcmllcyBhbG9uZyB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgdGhlIGdpdmVuIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBwYXRoIEEgcmVmZXJlbmNlIHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgcGF0aCBvZiBhIGZpbGUuCisgKiBAcGFyYW1baW5dIG1vZGUgVGhlIGFjY2VzcyBtb2RlIHRvIHVzZSBmb3IgdGhlIGRpcmVjdG9yaWVzIGJlaW5nIGNyZWF0ZWQuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0dsdWVfQ3JlYXRlRGlyZWN0b3JpZXMoY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpIHsKKyAgICBpbnQgcmVzdWx0ID0gVFJVRTsKKyAgICBzaXplX3QgcGFydGlhbFBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgY2hhciAqcGFydGlhbFBhdGggPSBtYWxsb2MocGFydGlhbFBhdGhMZW5ndGggKyAxKTsKKyAgICBpZiAocGFydGlhbFBhdGggPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRpYWxQYXRoTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChwYXRoW2ldID09ICcvJyAmJiBpID4gMCkgeworICAgICAgICAgICAgICAgIHBhcnRpYWxQYXRoW2ldID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAobWtkaXIocGFydGlhbFBhdGgsIG1vZGUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0aWFsUGF0aFtpXSA9IHBhdGhbaV07CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwYXJ0aWFsUGF0aCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIHJvdW5kIGtleXMgdXNlZCBmb3IgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZiBzZXNzaW9uIGtleXMuIEZpcnN0IGNyZWF0ZXMgYQorICogZGV2aWNlLXVuaXF1ZSBrZXktZW5jcnlwdGlvbiBrZXkgaWYgbm9uZSBleGlzdHMgeWV0LgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplUm91bmRLZXlzKCkgeworICAgIHVuc2lnbmVkIGNoYXIga2V5RW5jcnlwdGlvbktleVtLRVlfU0laRV07CisgICAgaW50IGZpbGVEZXNjID0gb3BlbihzdHJLZXlGaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmaWxlRGVzYyA+PSAwKSB7CisgICAgICAgIGlmIChyZWFkKGZpbGVEZXNjLCBrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRSkgPT0gS0VZX1NJWkUpIHsKKyAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICB9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCAmJgorICAgICAgICAgICAgICAgRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFKSAmJgorICAgICAgICAgICAgICAgRndkTG9ja0dsdWVfQ3JlYXRlRGlyZWN0b3JpZXMoc3RyS2V5RmlsZW5hbWUsIFNfSVJXWFUpKSB7CisgICAgICAgIGZpbGVEZXNjID0gb3BlbihzdHJLZXlGaWxlbmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwgU19JUlVTUik7CisgICAgICAgIGlmIChmaWxlRGVzYyA+PSAwKSB7CisgICAgICAgICAgICBpZiAod3JpdGUoZmlsZURlc2MsIGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFKSA9PSBLRVlfU0laRSkgeworICAgICAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpY2xvc2UoZmlsZURlc2MpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpc0luaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFX0lOX0JJVFMsICZlbmNyeXB0aW9uUm91bmRLZXlzKSAhPSAwIHx8CisgICAgICAgICAgICBBRVNfc2V0X2RlY3J5cHRfa2V5KGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFX0lOX0JJVFMsICZkZWNyeXB0aW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtc2V0KGtleUVuY3J5cHRpb25LZXksIDAsIEtFWV9TSVpFKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCit9CisKKy8qKgorICogVmFsaWRhdGVzIHRoZSBwYWRkaW5nIG9mIGEgZGVjcnlwdGVkIGtleS4KKyAqCisgKiBAcGFyYW1baW5dIHBEYXRhIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkIGtleSBhbmQgcGFkZGluZy4KKyAqIEBwYXJhbVtpbl0gZGVjcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRlY3J5cHRlZCBrZXkuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYWRkaW5nIHdhcyB2YWxpZC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrR2x1ZV9WYWxpZGF0ZVBhZGRpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqcERhdGEsIHNpemVfdCBkZWNyeXB0ZWRLZXlMZW5ndGgpIHsKKyAgICBzaXplX3QgaTsKKyAgICBzaXplX3QgcGFkZGluZyA9IEFFU19CTE9DS19TSVpFIC0gKGRlY3J5cHRlZEtleUxlbmd0aCAlIEFFU19CTE9DS19TSVpFKTsKKyAgICBwRGF0YSArPSBkZWNyeXB0ZWRLZXlMZW5ndGg7CisgICAgZm9yIChpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkgeworICAgICAgICBpZiAoKHNpemVfdCkqcERhdGEgIT0gcGFkZGluZykgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICsrcERhdGE7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitpbnQgRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcykgeworICAgIC8vIEdlbmVyYXRlICdjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUnIHJhbmRvbSBieXRlcyBieSByZWFkaW5nIHRoZW0gZnJvbSAiL2Rldi91cmFuZG9tIiAodGhlCisgICAgLy8gbm9uLWJsb2NraW5nIHZlcnNpb24gb2YgIi9kZXYvcmFuZG9tIikuCisgICAgc3NpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIGludCBmaWxlRGVzYyA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmlsZURlc2MgPj0gMCkgeworICAgICAgICBudW1CeXRlc1JlYWQgPSByZWFkKGZpbGVEZXNjLCBwQnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICB9CisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZCA+PSAwICYmIChzaXplX3QpbnVtQnl0ZXNSZWFkID09IG51bUJ5dGVzOworfQorCitpbnQgRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKSB7CisgICAgc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKyAgICBwdGhyZWFkX29uY2UoJm9uY2UsIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVSb3VuZEtleXMpOworICAgIHJldHVybiBpc0luaXRpYWxpemVkOworfQorCitzaXplX3QgRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgpIHsKKyAgICByZXR1cm4gKChwbGFpbnRleHRLZXlMZW5ndGggLyBBRVNfQkxPQ0tfU0laRSkgKyAyKSAqIEFFU19CTE9DS19TSVpFOworfQorCitpbnQgRndkTG9ja0dsdWVfRW5jcnlwdEtleShjb25zdCB2b2lkICpwUGxhaW50ZXh0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBsYWludGV4dEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoKSB7CisgICAgaW50IHJlc3VsdCA9IEZBTFNFOworICAgIGFzc2VydChlbmNyeXB0ZWRLZXlMZW5ndGggPT0gRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKHBsYWludGV4dEtleUxlbmd0aCkpOworICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5pdFZlY3RvcltBRVNfQkxPQ0tfU0laRV07CisgICAgICAgIGlmIChGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIoaW5pdFZlY3RvciwgQUVTX0JMT0NLX1NJWkUpKSB7CisgICAgICAgICAgICBzaXplX3QgcGFkZGluZyA9IEFFU19CTE9DS19TSVpFIC0gKHBsYWludGV4dEtleUxlbmd0aCAlIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIHNpemVfdCBkYXRhTGVuZ3RoID0gZW5jcnlwdGVkS2V5TGVuZ3RoIC0gQUVTX0JMT0NLX1NJWkU7CisgICAgICAgICAgICBtZW1jcHkocEVuY3J5cHRlZEtleSwgcFBsYWludGV4dEtleSwgcGxhaW50ZXh0S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbXNldCgodW5zaWduZWQgY2hhciAqKXBFbmNyeXB0ZWRLZXkgKyBwbGFpbnRleHRLZXlMZW5ndGgsIChpbnQpcGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwRW5jcnlwdGVkS2V5ICsgZGF0YUxlbmd0aCwgaW5pdFZlY3RvciwgQUVTX0JMT0NLX1NJWkUpOworICAgICAgICAgICAgQUVTX2NiY19lbmNyeXB0KHBFbmNyeXB0ZWRLZXksIHBFbmNyeXB0ZWRLZXksIGRhdGFMZW5ndGgsICZlbmNyeXB0aW9uUm91bmRLZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRWZWN0b3IsIEFFU19FTkNSWVBUKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IEZ3ZExvY2tHbHVlX0RlY3J5cHRLZXkoY29uc3Qgdm9pZCAqcEVuY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRGVjcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY3J5cHRlZEtleUxlbmd0aCkgeworICAgIGludCByZXN1bHQgPSBGQUxTRTsKKyAgICBhc3NlcnQoZW5jcnlwdGVkS2V5TGVuZ3RoID09IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChkZWNyeXB0ZWRLZXlMZW5ndGgpKTsKKyAgICBpZiAoRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKSkgeworICAgICAgICBzaXplX3QgZGF0YUxlbmd0aCA9IGVuY3J5cHRlZEtleUxlbmd0aCAtIEFFU19CTE9DS19TSVpFOworICAgICAgICB1bnNpZ25lZCBjaGFyICpwRGF0YSA9IG1hbGxvYyhkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKHBEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5pdFZlY3RvcltBRVNfQkxPQ0tfU0laRV07CisgICAgICAgICAgICBtZW1jcHkocERhdGEsIHBFbmNyeXB0ZWRLZXksIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KGluaXRWZWN0b3IsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcEVuY3J5cHRlZEtleSArIGRhdGFMZW5ndGgsIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIEFFU19jYmNfZW5jcnlwdChwRGF0YSwgcERhdGEsIGRhdGFMZW5ndGgsICZkZWNyeXB0aW9uUm91bmRLZXlzLCBpbml0VmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19ERUNSWVBUKTsKKyAgICAgICAgICAgIG1lbWNweShwRGVjcnlwdGVkS2V5LCBwRGF0YSwgZGVjcnlwdGVkS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZ3ZExvY2tHbHVlX1ZhbGlkYXRlUGFkZGluZyhwRGF0YSwgZGVjcnlwdGVkS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIGZyZWUocERhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmY2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tHTFVFX0hfXworI2RlZmluZSBfX0ZXRExPQ0tHTFVFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gYnl0ZXMuCisgKgorICogQHBhcmFtW291dF0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJhbmRvbSBkYXRhLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcih2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZSBrZXktZW5jcnlwdGlvbiBrZXkuIFNob3VsZCBiZSBjYWxsZWQgb25jZSBkdXJpbmcgc3RhcnR1cCB0bworICogZmFjaWxpdGF0ZSBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIG9mIHNlc3Npb24ga2V5cy4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNyeXB0ZWQga2V5LCBnaXZlbiB0aGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQga2V5LgorICoKKyAqIEBwYXJhbVtpbl0gcGxhaW50ZXh0S2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHBsYWludGV4dCBrZXkuCisgKgorICogQHJldHVybiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQga2V5LgorICovCitzaXplX3QgRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgpOworCisvKioKKyAqIEVuY3J5cHRzIHRoZSBnaXZlbiBzZXNzaW9uIGtleSB1c2luZyBhIGtleS1lbmNyeXB0aW9uIGtleSB1bmlxdWUgdG8gdGhpcyBkZXZpY2UuCisgKgorICogQHBhcmFtW2luXSBwUGxhaW50ZXh0S2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgcGxhaW50ZXh0IGtleS4KKyAqIEBwYXJhbVtpbl0gcGxhaW50ZXh0S2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHBsYWludGV4dCBrZXkuCisgKiBAcGFyYW1bb3V0XSBwRW5jcnlwdGVkS2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZW5jcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtpbl0gZW5jcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBrZXkuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9FbmNyeXB0S2V5KGNvbnN0IHZvaWQgKnBQbGFpbnRleHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEVuY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRLZXlMZW5ndGgpOworCisvKioKKyAqIERlY3J5cHRzIHRoZSBnaXZlbiBzZXNzaW9uIGtleSB1c2luZyBhIGtleS1lbmNyeXB0aW9uIGtleSB1bmlxdWUgdG8gdGhpcyBkZXZpY2UuCisgKgorICogQHBhcmFtW2luXSBwRW5jcnlwdGVkS2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZW5jcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtpbl0gZW5jcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1bb3V0XSBwRGVjcnlwdGVkS2V5IEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtpbl0gZGVjcnlwdGVkS2V5TGVuZ3RoIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRlY3J5cHRlZCBrZXkuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9EZWNyeXB0S2V5KGNvbnN0IHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcERlY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWNyeXB0ZWRLZXlMZW5ndGgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX19GV0RMT0NLR0xVRV9IX18KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiYjc4OAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEZ3ZExvY2tDb252LmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9NT0RVTEUgOj0gbGliZndkbG9jay1jb252ZXJ0ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVhOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMKQEAgLTAsMCArMSwxMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCisjaW5jbHVkZSAiRndkTG9ja0NvbnYuaCIKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKKyNkZWZpbmUgSU5WQUxJRF9PRkZTRVQgKChvZmY2NF90KS0xKQorCisjZGVmaW5lIE1BWF9OVU1fU0VTU0lPTlMgMzIKKworI2RlZmluZSBPVVRQVVRfQlVGRkVSX1NJWkVfSU5DUkVNRU5UIDEwMjQKKyNkZWZpbmUgUkVBRF9CVUZGRVJfU0laRSAxMDI0CisKKyNkZWZpbmUgTUFYX0JPVU5EQVJZX0xFTkdUSCA3MAorI2RlZmluZSBNQVhfREVMSU1JVEVSX0xFTkdUSCAoTUFYX0JPVU5EQVJZX0xFTkdUSCArIDQpCisKKyNkZWZpbmUgU1RSSU5HX0xFTkdUSF9JTkNSRU1FTlQgMjUKKworI2RlZmluZSBLRVlfU0laRSBBRVNfQkxPQ0tfU0laRQorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKKyNkZWZpbmUgU0hBMV9IQVNIX1NJWkUgMjAKKworI2RlZmluZSBGV0RfTE9DS19WRVJTSU9OIDAKKyNkZWZpbmUgRldEX0xPQ0tfU1VCRk9STUFUIDAKKyNkZWZpbmUgVVNBR0VfUkVTVFJJQ1RJT05fRkxBR1MgMAorI2RlZmluZSBDT05URU5UX1RZUEVfTEVOR1RIX1BPUyA3CisjZGVmaW5lIFRPUF9IRUFERVJfU0laRSA4CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgcGFyc2VyIHN0YXRlcyBvZiB0aGUgY29udmVydGVyLgorICovCit0eXBlZGVmIGVudW0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGUgeworICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzT3BlbkRlbGltaXRlciwKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzLAorICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmluYXJ5RW5jb2RlZERhdGEsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCYXNlNjRFbmNvZGVkRGF0YSwKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lCit9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgc2Nhbm5lciBzdGF0ZXMgb2YgdGhlIGNvbnZlcnRlci4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZSB7CisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2gsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1IsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZUVuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZVN0YXJ0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RhcnQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0FfT1JfSSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfTiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfWSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUywKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfRSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfSSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfVCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlcnNFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTEsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTFfQWZ0ZXJDUkxGLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUyLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUzLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGU0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1BhZGRpbmcsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXIKK30gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZy4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nIHsKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19VbmRlZmluZWQsCisgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5LAorICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0Jhc2U2NAorfSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ190OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgYSBkeW5hbWljYWxseSBncm93aW5nIHN0cmluZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfU3RyaW5nIHsKKyAgICBjaGFyICpwdHI7CisgICAgc2l6ZV90IGxlbmd0aDsKKyAgICBzaXplX3QgbWF4TGVuZ3RoOworICAgIHNpemVfdCBsZW5ndGhJbmNyZW1lbnQ7Cit9IEZ3ZExvY2tDb252X1N0cmluZ190OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHBlci1maWxlIHN0YXRlIGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgY29udmVydGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBGd2RMb2NrQ29udl9TZXNzaW9uIHsKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV90IHBhcnNlclN0YXRlOworICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV90IHNjYW5uZXJTdGF0ZTsKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfdCBzYXZlZFNjYW5uZXJTdGF0ZTsKKyAgICBvZmY2NF90IG51bUNoYXJzQ29uc3VtZWQ7CisgICAgY2hhciBkZWxpbWl0ZXJbTUFYX0RFTElNSVRFUl9MRU5HVEhdOworICAgIHNpemVfdCBkZWxpbWl0ZXJMZW5ndGg7CisgICAgc2l6ZV90IGRlbGltaXRlck1hdGNoUG9zOworICAgIEZ3ZExvY2tDb252X1N0cmluZ190IG1pbWVIZWFkZXJOYW1lOworICAgIEZ3ZExvY2tDb252X1N0cmluZ190IGNvbnRlbnRUeXBlOworICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX3QgY29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgdW5zaWduZWQgY2hhciBzZXNzaW9uS2V5W0tFWV9TSVpFXTsKKyAgICB2b2lkICpwRW5jcnlwdGVkU2Vzc2lvbktleTsKKyAgICBzaXplX3QgZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aDsKKyAgICBBRVNfS0VZIGVuY3J5cHRpb25Sb3VuZEtleXM7CisgICAgSE1BQ19DVFggc2lnbmluZ0NvbnRleHQ7CisgICAgdW5zaWduZWQgY2hhciB0b3BIZWFkZXJbVE9QX0hFQURFUl9TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGNvdW50ZXJbQUVTX0JMT0NLX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIga2V5U3RyZWFtW0FFU19CTE9DS19TSVpFXTsKKyAgICBpbnQga2V5U3RyZWFtSW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZTsKKyAgICBzaXplX3QgZGF0YU9mZnNldDsKKyAgICBzaXplX3QgbnVtRGF0YUJ5dGVzOworfSBGd2RMb2NrQ29udl9TZXNzaW9uX3Q7CisKK3N0YXRpYyBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnNlc3Npb25QdHJzW01BWF9OVU1fU0VTU0lPTlNdID0geyBOVUxMIH07CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitzdGF0aWMgY29uc3QgRndkTG9ja0NvbnZfU3RyaW5nX3QgbnVsbFN0cmluZyA9IHsgTlVMTCwgMCwgMCwgU1RSSU5HX0xFTkdUSF9JTkNSRU1FTlQgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdG9wSGVhZGVyVGVtcGxhdGVbXSA9CisgICAgeyAnRicsICdXJywgJ0wnLCAnSycsIEZXRF9MT0NLX1ZFUlNJT04sIEZXRF9MT0NLX1NVQkZPUk1BVCwgVVNBR0VfUkVTVFJJQ1RJT05fRkxBR1MgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgc3RyQ29udGVudFtdID0gImNvbnRlbnQtIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0clR5cGVbXSA9ICJ0eXBlIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0clRyYW5zZmVyRW5jb2RpbmdbXSA9ICJ0cmFuc2Zlci1lbmNvZGluZyI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJUZXh0UGxhaW5bXSA9ICJ0ZXh0L3BsYWluIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0ckFwcGxpY2F0aW9uVm5kT21hRHJtUmlnaHRzWG1sW10gPSAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ucmlnaHRzK3htbCI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJBcHBsaWNhdGlvblZuZE9tYURybUNvbnRlbnRbXSA9ICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5jb250ZW50IjsKKworc3RhdGljIGNvbnN0IHNpemVfdCBzdHJsZW5Db250ZW50ID0gc2l6ZW9mIHN0ckNvbnRlbnQgLSAxOworc3RhdGljIGNvbnN0IHNpemVfdCBzdHJsZW5UZXh0UGxhaW4gPSBzaXplb2Ygc3RyVGV4dFBsYWluIC0gMTsKKworc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGJhc2U2NFZhbHVlc1tdID0geworICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLAorICAgIC0xLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIC0xLCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MQorfTsKKworLyoqCisgKiBBY3F1aXJlcyBhbiB1bnVzZWQgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfQWNxdWlyZVNlc3Npb24oKSB7CisgICAgaW50IHNlc3Npb25JZCA9IC0xOworICAgIGludCBpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFU1NJT05TOyArK2kpIHsKKyAgICAgICAgaWYgKHNlc3Npb25QdHJzW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNlc3Npb25QdHJzW2ldID0gbWFsbG9jKHNpemVvZiAqc2Vzc2lvblB0cnNbaV0pOworICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICByZXR1cm4gc2Vzc2lvbklkOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgc2Vzc2lvbiBJRCBpcyBpbiByYW5nZSBhbmQgY3VycmVudGx5IGluIHVzZS4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JRCBBIHNlc3Npb24gSUQuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzZXNzaW9uIElEIGlzIGluIHJhbmdlIGFuZCBjdXJyZW50bHkgaW4gdXNlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKGludCBzZXNzaW9uSWQpIHsKKyAgICByZXR1cm4gMCA8PSBzZXNzaW9uSWQgJiYgc2Vzc2lvbklkIDwgTUFYX05VTV9TRVNTSU9OUyAmJiBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdICE9IE5VTEw7Cit9CisKKy8qKgorICogUmVsZWFzZXMgYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JRCBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tDb252X1JlbGVhc2VTZXNzaW9uKGludCBzZXNzaW9uSWQpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICBhc3NlcnQoRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oc2Vzc2lvbklkKSk7CisgICAgbWVtc2V0KHNlc3Npb25QdHJzW3Nlc3Npb25JZF0sIDAsIHNpemVvZiAqc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7CisgICAgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKK30KKworLyoqCisgKiBEZXJpdmVzIGNyeXB0b2dyYXBoaWNhbGx5IGluZGVwZW5kZW50IGtleXMgZm9yIGVuY3J5cHRpb24gYW5kIHNpZ25pbmcgZnJvbSB0aGUgc2Vzc2lvbiBrZXkuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfRGVyaXZlS2V5cyhGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIHN0cnVjdCBGd2RMb2NrQ29udl9EZXJpdmVLZXlzX0RhdGEgeworICAgICAgICBBRVNfS0VZIHNlc3Npb25Sb3VuZEtleXM7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWVbS0VZX1NJWkVdOworICAgICAgICB1bnNpZ25lZCBjaGFyIGtleVtLRVlfU0laRV07CisgICAgfSAqcERhdGEgPSBtYWxsb2Moc2l6ZW9mICpwRGF0YSk7CisgICAgaWYgKHBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBTZXNzaW9uLT5zZXNzaW9uS2V5LCBLRVlfU0laRV9JTl9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHswLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIGVuY3J5cHRpb24ga2V5LgorICAgICAgICAgICAgbWVtc2V0KHBEYXRhLT52YWx1ZSwgMCwgS0VZX1NJWkUpOworICAgICAgICAgICAgQUVTX2VuY3J5cHQocERhdGEtPnZhbHVlLCBwRGF0YS0+a2V5LCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpOworICAgICAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocERhdGEtPmtleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+ZW5jcnlwdGlvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgdGhlIDE2LWJ5dGUgdmFsdWUgezEsIDAsIC4uLiwgMH0gdG8gcHJvZHVjZSB0aGUgc2lnbmluZyBrZXkuCisgICAgICAgICAgICAgICAgKytwRGF0YS0+dmFsdWVbMF07CisgICAgICAgICAgICAgICAgQUVTX2VuY3J5cHQocERhdGEtPnZhbHVlLCBwRGF0YS0+a2V5LCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpOworICAgICAgICAgICAgICAgIEhNQUNfQ1RYX2luaXQoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5rZXksIEtFWV9TSVpFLCBFVlBfc2hhMSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHBEYXRhLCAwLCBzaXplb2YgcERhdGEpOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICAgICAgZnJlZShwRGF0YSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBib3VuZGFyeS4gTm90ZSB0aGF0IHRoZSBib3VuZGFyeSBtYXkgY29udGFpbgorICogbGVhZGluZyBhbmQgaW50ZXJuYWwgc3BhY2VzLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIGJvdW5kYXJ5LgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzQm91bmRhcnlDaGFyKGludCBjaCkgeworICAgIHJldHVybiBpc2FsbnVtKGNoKSB8fCBjaCA9PSAnXCcnIHx8CisgICAgICAgICAgICBjaCA9PSAnKCcgfHwgY2ggPT0gJyknIHx8IGNoID09ICcrJyB8fCBjaCA9PSAnXycgfHwgY2ggPT0gJywnIHx8IGNoID09ICctJyB8fAorICAgICAgICAgICAgY2ggPT0gJy4nIHx8IGNoID09ICcvJyB8fCBjaCA9PSAnOicgfHwgY2ggPT0gJz0nIHx8IGNoID09ICc/JyB8fCBjaCA9PSAnICc7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZSwgdXNpbmcgYSBuYXJyb3dlciBkZWZpbml0aW9uCisgKiB0aGFuIHRoZSBzdGFuZGFyZC1saWJyYXJ5IGlzc3BhY2UoKSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgd2hpdGVzcGFjZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoaW50IGNoKSB7CisgICAgcmV0dXJuIGNoID09ICcgJyB8fCBjaCA9PSAnXHQnOworfQorCisvKioKKyAqIFJlbW92ZXMgdHJhaWxpbmcgc3BhY2VzIGZyb20gdGhlIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1JpZ2h0VHJpbURlbGltaXRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgd2hpbGUgKHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggPiA0ICYmCisgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCAtIDFdID09ICcgJykgeworICAgICAgICAtLXBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGg7CisgICAgfQorICAgIGlmIChwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoID4gNCkgeworICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIH0KKyAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworfQorCisvKioKKyAqIE1hdGNoZXMgdGhlIG9wZW4gZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X01hdGNoT3BlbkRlbGltaXRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIC8vIFRoZSBkZWxpbWl0ZXIgc3RhcnRzIHdpdGggIlxyXG4tLSIgKHRoZSBvcGVuIGRlbGltaXRlciBtYXkgb21pdCB0aGUgaW5pdGlhbCAiXHJcbiIpLgorICAgICAgICAgICAgLy8gVGhlIHJlc3QgaXMgdGhlIHVzZXItZGVmaW5lZCBib3VuZGFyeSB0aGF0IHNob3VsZCBjb21lIG5leHQuCisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzBdID0gJ1xyJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbMV0gPSAnXG4nOworICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlclsyXSA9ICctJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbM10gPSAnLSc7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoID0gNDsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjoKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCAhPSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeToKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQm91bmRhcnlDaGFyKGNoKSkgeworICAgICAgICAgICAgLy8gVGhlIGJvdW5kYXJ5IG1heSBjb250YWluIGxlYWRpbmcgYW5kIGludGVybmFsIHNwYWNlcywgc28gdHJhaWxpbmcgc3BhY2VzIHdpbGwgYWxzbyBiZQorICAgICAgICAgICAgLy8gbWF0Y2hlZCBoZXJlLiBUaGVzZSB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIuCisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA8IE1BWF9ERUxJTUlURVJfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoKytdID0gY2g7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoICE9ICcgJykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9SaWdodFRyaW1EZWxpbWl0ZXIocFNlc3Npb24pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1x0JykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmlnaHRUcmltRGVsaW1pdGVyKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeUVuZDoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzTWltZUhlYWRlcnM7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIG5hbWUuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgbmFtZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJOYW1lQ2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gaXNncmFwaChjaCkgJiYgY2ggIT0gJzonOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgdmFsdWUuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyVmFsdWVDaGFyKGludCBjaCkgeworICAgIHJldHVybiBpc2dyYXBoKGNoKSAmJiBjaCAhPSAnOyc7Cit9CisKKy8qKgorICogQXBwZW5kcyBhIGNoYXJhY3RlciB0byB0aGUgc3BlY2lmaWVkIGR5bmFtaWNhbGx5IGdyb3dpbmcgc3RyaW5nLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTdHJpbmcgQSByZWZlcmVuY2UgdG8gYSBkeW5hbWljYWxseSBncm93aW5nIHN0cmluZy4KKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBhcHBlbmQuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKEZ3ZExvY2tDb252X1N0cmluZ190ICpwU3RyaW5nLCBpbnQgY2gpIHsKKyAgICBpZiAocFN0cmluZy0+bGVuZ3RoID09IHBTdHJpbmctPm1heExlbmd0aCkgeworICAgICAgICBzaXplX3QgbmV3TWF4TGVuZ3RoID0gcFN0cmluZy0+bWF4TGVuZ3RoICsgcFN0cmluZy0+bGVuZ3RoSW5jcmVtZW50OworICAgICAgICBjaGFyICpuZXdQdHIgPSByZWFsbG9jKHBTdHJpbmctPnB0ciwgbmV3TWF4TGVuZ3RoICsgMSk7CisgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfQorICAgICAgICBwU3RyaW5nLT5wdHIgPSBuZXdQdHI7CisgICAgICAgIHBTdHJpbmctPm1heExlbmd0aCA9IG5ld01heExlbmd0aDsKKyAgICB9CisgICAgcFN0cmluZy0+cHRyW3BTdHJpbmctPmxlbmd0aCsrXSA9IGNoOworICAgIHBTdHJpbmctPnB0cltwU3RyaW5nLT5sZW5ndGhdID0gJ1wwJzsKKyAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX09LOworfQorCisvKioKKyAqIEF0dGVtcHRzIHRvIHJlY29nbml6ZSB0aGUgTUlNRSBoZWFkZXIgbmFtZSBhbmQgY2hhbmdlcyB0aGUgc2Nhbm5lciBzdGF0ZSBhY2NvcmRpbmdseS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1JlY29nbml6ZU1pbWVIZWFkZXJOYW1lKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgaWYgKHN0cm5jbXAocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0ciwgc3RyQ29udGVudCwgc3RybGVuQ29udGVudCkgPT0gMCkgeworICAgICAgICBpZiAoc3RyY21wKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIgKyBzdHJsZW5Db250ZW50LCBzdHJUeXBlKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0ciArIHN0cmxlbkNvbnRlbnQsIHN0clRyYW5zZmVyRW5jb2RpbmcpID09IDApIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPT0KKyAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBBcHBsaWVzIGRlZmF1bHRzIHRvIG1pc3NpbmcgTUlNRSBoZWFkZXIgdmFsdWVzLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQXBwbHlEZWZhdWx0cyhGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICAvLyBDb250ZW50IHR5cGUgaXMgbWlzc2luZzogZGVmYXVsdCB0byAidGV4dC9wbGFpbiIuCisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPSBtYWxsb2Moc2l6ZW9mIHN0clRleHRQbGFpbik7CisgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHN0clRleHRQbGFpbiwgc2l6ZW9mIHN0clRleHRQbGFpbik7CisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGggPSBzdHJsZW5UZXh0UGxhaW47CisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5tYXhMZW5ndGggPSBzdHJsZW5UZXh0UGxhaW47CisgICAgfQorICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPT0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkKSB7CisgICAgICAgIC8vIENvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgaXMgbWlzc2luZzogZGVmYXVsdCB0byBiaW5hcnkuCisgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeTsKKyAgICB9CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKK30KKworLyoqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBjb250ZW50IHR5cGUgaXMgc3VwcG9ydGVkLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfVmVyaWZ5Q29udGVudFR5cGUoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgfSBlbHNlIGlmIChzdHJjbXAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1SaWdodHNYbWwpID09IDAgfHwKKyAgICAgICAgICAgICAgIHN0cmNtcChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBzdHJBcHBsaWNhdGlvblZuZE9tYURybUNvbnRlbnQpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBoZWFkZXIgb2YgdGhlIG91dHB1dCBmaWxlLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1bb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1dyaXRlSGVhZGVyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGggPiBVQ0hBUl9NQVgpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplID0gT1VUUFVUX0JVRkZFUl9TSVpFX0lOQ1JFTUVOVDsKKyAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPSBtYWxsb2MocFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICBpZiAocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlQb3MgPSBUT1BfSEVBREVSX1NJWkUgKyBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoOworICAgICAgICAgICAgc2l6ZV90IGRhdGFTaWduYXR1cmVQb3MgPSBlbmNyeXB0ZWRTZXNzaW9uS2V5UG9zICsgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgICAgICAgICBzaXplX3QgaGVhZGVyU2lnbmF0dXJlUG9zID0gZGF0YVNpZ25hdHVyZVBvcyArIFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQgPSBoZWFkZXJTaWduYXR1cmVQb3MgKyBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgIG1lbWNweShwU2Vzc2lvbi0+dG9wSGVhZGVyLCB0b3BIZWFkZXJUZW1wbGF0ZSwgc2l6ZW9mIHRvcEhlYWRlclRlbXBsYXRlKTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT50b3BIZWFkZXJbQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1NdID0KKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aDsKKyAgICAgICAgICAgIG1lbWNweShwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgVE9QX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBlbmNyeXB0ZWRTZXNzaW9uS2V5UG9zLAorICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworCisgICAgICAgICAgICAvLyBTZXQgdGhlIHNpZ25hdHVyZXMgdG8gYWxsIHplcm9zIGZvciBub3c7IHRoZXkgd2lsbCBoYXZlIHRvIGJlIHVwZGF0ZWQgbGF0ZXIuCisgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciArIGRhdGFTaWduYXR1cmVQb3MsIDAsCisgICAgICAgICAgICAgICAgICAgU0hBMV9IQVNIX1NJWkUpOworICAgICAgICAgICAgbWVtc2V0KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBoZWFkZXJTaWduYXR1cmVQb3MsIDAsCisgICAgICAgICAgICAgICAgICAgU0hBMV9IQVNIX1NJWkUpOworCisgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPSBwU2Vzc2lvbi0+ZGF0YU9mZnNldDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIE1hdGNoZXMgdGhlIE1JTUUgaGVhZGVycy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hNaW1lSGVhZGVycyhGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZVN0YXJ0OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyTmFtZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUubGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZCgmcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLCB0b2xvd2VyKGNoKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlcnNFbmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyTmFtZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZSwgdG9sb3dlcihjaCkpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc6JykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmVjb2duaXplTWltZUhlYWRlck5hbWUocFNlc3Npb24pOworICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lRW5kOgorICAgICAgICBpZiAoY2ggPT0gJzonKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9SZWNvZ25pemVNaW1lSGVhZGVyTmFtZShwU2Vzc2lvbik7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlU3RhcnQ6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJWYWx1ZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5jb250ZW50VHlwZSwgdG9sb3dlcihjaCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyVmFsdWVDaGFyKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+Y29udGVudFR5cGUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJWYWx1ZUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nU3RhcnQ6CisgICAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0FfT1JfSTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnNycgfHwgY2ggPT0gJzgnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0I7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0FfT1JfSToKKyAgICAgICAgaWYgKGNoID09ICdpJyB8fCBjaCA9PSAnSScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfTjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnYScgfHwgY2ggPT0gJ0EnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19OOgorICAgICAgICBpZiAoY2ggPT0gJ24nIHx8IGNoID09ICdOJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQToKKyAgICAgICAgaWYgKGNoID09ICdhJyB8fCBjaCA9PSAnQScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1I6CisgICAgICAgIGlmIChjaCA9PSAncicgfHwgY2ggPT0gJ1InKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19ZOgorICAgICAgICBpZiAoY2ggPT0gJ3knIHx8IGNoID09ICdZJykgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUzoKKyAgICAgICAgaWYgKGNoID09ICdzJyB8fCBjaCA9PSAnUycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0U6CisgICAgICAgIGlmIChjaCA9PSAnZScgfHwgY2ggPT0gJ0UnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c182OgorICAgICAgICBpZiAoY2ggPT0gJzYnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c180OgorICAgICAgICBpZiAoY2ggPT0gJzQnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CYXNlNjQ7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19COgorICAgICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19JOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfSToKKyAgICAgICAgaWYgKGNoID09ICdpJyB8fCBjaCA9PSAnSScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1Q6CisgICAgICAgIGlmIChjaCA9PSAndCcgfHwgY2ggPT0gJ1QnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnk7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOgorICAgICAgICBpZiAoY2ggPT0gJzsnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJWYWx1ZUVuZDoKKyAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZVN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlcnNFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9BcHBseURlZmF1bHRzKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfVmVyaWZ5Q29udGVudFR5cGUocFNlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUhlYWRlcihwU2Vzc2lvbiwgcE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeSkgeworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0JpbmFyeUVuY29kZWREYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmFzZTY0RW5jb2RlZERhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIHRoZSBjb3VudGVyLCB0cmVhdGVkIGFzIGEgMTYtYnl0ZSBsaXR0bGUtZW5kaWFuIG51bWJlciwgYnkgb25lLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tDb252X0luY3JlbWVudENvdW50ZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoKCsrcFNlc3Npb24tPmNvdW50ZXJbaV0gPT0gMCkgJiYgKCsraSA8IEFFU19CTE9DS19TSVpFKSkKKyAgICAgICAgOworfQorCisvKioKKyAqIEVuY3J5cHRzIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYW5kIHdyaXRlcyBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGVuY3J5cHQgYW5kIHdyaXRlLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBpZiAocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID09IHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplKSB7CisgICAgICAgIHZvaWQgKnBCdWZmZXI7CisgICAgICAgIHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplICs9IE9VVFBVVF9CVUZGRVJfU0laRV9JTkNSRU1FTlQ7CisgICAgICAgIHBCdWZmZXIgPSByZWFsbG9jKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyLCBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPSBwQnVmZmVyOworICAgIH0KKyAgICBpZiAoKytwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPT0gQUVTX0JMT0NLX1NJWkUpIHsKKyAgICAgICAgRndkTG9ja0NvbnZfSW5jcmVtZW50Q291bnRlcihwU2Vzc2lvbik7CisgICAgICAgIHBTZXNzaW9uLT5rZXlTdHJlYW1JbmRleCA9IDA7CisgICAgfQorICAgIGlmIChwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPT0gMCkgeworICAgICAgICBBRVNfZW5jcnlwdChwU2Vzc2lvbi0+Y291bnRlciwgcFNlc3Npb24tPmtleVN0cmVhbSwgJnBTZXNzaW9uLT5lbmNyeXB0aW9uUm91bmRLZXlzKTsKKyAgICB9CisgICAgY2ggXj0gcFNlc3Npb24tPmtleVN0cmVhbVtwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXhdOworICAgICgodW5zaWduZWQgY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyKVtwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMrK10gPSBjaDsKKyAgICArK3BTZXNzaW9uLT5udW1EYXRhQnl0ZXM7CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKK30KKworLyoqCisgKiBNYXRjaGVzIGJpbmFyeS1lbmNvZGVkIGNvbnRlbnQgZGF0YSBhbmQgZW5jcnlwdHMgaXQsIHdoaWxlIGxvb2tpbmcgb3V0IGZvciB0aGUgY2xvc2UgZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaEJpbmFyeUVuY29kZWREYXRhKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOgorICAgICAgICBpZiAoY2ggIT0gcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3NdKSB7CisgICAgICAgICAgICAvLyBUaGUgcGFydGlhbCBtYXRjaCBvZiB0aGUgZGVsaW1pdGVyIHR1cm5lZCBvdXQgdG8gYmUgc3B1cmlvdXMuIEZsdXNoIHRoZSBtYXRjaGVkIGJ5dGVzCisgICAgICAgICAgICAvLyB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvczsgKytpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+ZGVsaW1pdGVyW2ldLCBwT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoICE9IHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zXSkgeworICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzbid0IHBhcnQgb2YgdGhlIGRlbGltaXRlci4gV3JpdGUgaXQgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIGlmICgrK3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9PSBwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBUaGUgZW50aXJlIGRlbGltaXRlciBoYXMgYmVlbiBtYXRjaGVkLiBUaGUgb25seSB2YWxpZCBjaGFyYWN0ZXJzIG5vdyBhcmUgdGhlICItLSIKKyAgICAgICAgICAgIC8vIHRoYXQgY29tcGxldGUgdGhlIGNsb3NlIGRlbGltaXRlciAobm8gbW9yZSBtZXNzYWdlIHBhcnRzIGFyZSBleHBlY3RlZCkuCisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYmFzZTY0LWVuY29kZWQgZGF0YS4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYmFzZTY0LWVuY29kZWQgZGF0YS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoaW50IGNoKSB7CisgICAgcmV0dXJuIDAgPD0gY2ggJiYgY2ggPD0gJ3onICYmIGJhc2U2NFZhbHVlc1tjaF0gPj0gMDsKK30KKworLyoqCisgKiBNYXRjaGVzIGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgZGF0YSBhbmQgZW5jcnlwdHMgaXQsIHdoaWxlIGxvb2tpbmcgb3V0IGZvciB0aGUgY2xvc2UgZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaEJhc2U2NEVuY29kZWREYXRhKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOgorICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTFfQWZ0ZXJDUkxGOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoID0gYmFzZTY0VmFsdWVzW2NoXSA8PCAyOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUyOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRjsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID09IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRikgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDM7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0RlbGltaXRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMjoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jaCB8PSBiYXNlNjRWYWx1ZXNbY2hdID4+IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIHBTZXNzaW9uLT5jaCwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jaCA9IGJhc2U2NFZhbHVlc1tjaF0gPDwgNDsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gcFNlc3Npb24tPnNjYW5uZXJTdGF0ZTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTM6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggfD0gYmFzZTY0VmFsdWVzW2NoXSA+PiAyOworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+Y2gsIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggPSBiYXNlNjRWYWx1ZXNbY2hdIDw8IDY7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGU0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zY2FubmVyU3RhdGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzUGFkZGluZzsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTQ6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggfD0gYmFzZTY0VmFsdWVzW2NoXTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmNoLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zY2FubmVyU3RhdGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZTsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzUGFkZGluZzoKKyAgICAgICAgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOgorICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEY6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRjsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID09IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2VfQWZ0ZXJDUkxGKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID0gMzsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXI6CisgICAgICAgIGlmIChjaCAhPSBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvc10pIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfSBlbHNlIGlmICgrK3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9PSBwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogUHVzaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBpbnRvIHRoZSBjb252ZXJ0ZXIncyBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9QdXNoQ2hhcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICArK3BTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkOworICAgIHN3aXRjaCAocFNlc3Npb24tPnBhcnNlclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c09wZW5EZWxpbWl0ZXI6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoT3BlbkRlbGltaXRlcihwU2Vzc2lvbiwgY2gpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzTWltZUhlYWRlcnM6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoTWltZUhlYWRlcnMocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0JpbmFyeUVuY29kZWREYXRhOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaEJpbmFyeUVuY29kZWREYXRhKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCYXNlNjRFbmNvZGVkRGF0YToKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfTWF0Y2hCYXNlNjRFbmNvZGVkRGF0YShwU2Vzc2lvbiwgY2gsIHBPdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmU6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKGludCAqcFNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBTZXNzaW9uSWQgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcFNlc3Npb25JZCA9IEZ3ZExvY2tDb252X0FjcXVpcmVTZXNzaW9uKCk7CisgICAgICAgIGlmICgqcFNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbKnBTZXNzaW9uSWRdOworICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggPSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoS0VZX1NJWkUpOworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoIDwgQUVTX0JMT0NLX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGlzIHVzZWQgYXMgdGhlIENUUi1tb2RlIG5vbmNlLCBzbyBpdCBtdXN0IGJlIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgLy8gdGhlIHNpemUgb2YgYSBzaW5nbGUgQUVTIGJsb2NrLgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9IG1hbGxvYyhwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcihwU2Vzc2lvbi0+c2Vzc2lvbktleSwgS0VZX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0dsdWVfRW5jcnlwdEtleShwU2Vzc2lvbi0+c2Vzc2lvbktleSwgS0VZX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9EZXJpdmVLZXlzKHBTZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBTZXNzaW9uLT5zZXNzaW9uS2V5LCAwLCBLRVlfU0laRSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBTZXNzaW9uLT5jb3VudGVyLCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzT3BlbkRlbGltaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lID0gbnVsbFN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZSA9IG51bGxTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19VbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5lcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9SZWxlYXNlU2Vzc2lvbigqcFNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgKnBTZXNzaW9uSWQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oc2Vzc2lvbklkKSB8fCBwQnVmZmVyID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCA9IDA7CisgICAgICAgIHBTZXNzaW9uLT5udW1EYXRhQnl0ZXMgPSAwOworICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPSAwOworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJ5dGVzOyArK2kpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1B1c2hDaGFyKHBTZXNzaW9uLCAoKGNoYXIgKilwQnVmZmVyKVtpXSwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGRhdGEgc2lnbmF0dXJlLgorICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlcilbcFNlc3Npb24tPmRhdGFPZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm51bURhdGFCeXRlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcikgeworICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zID0gcFNlc3Npb24tPm51bUNoYXJzQ29uc3VtZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uKGludCBzZXNzaW9uSWQsIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oc2Vzc2lvbklkKSB8fCBwT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgZnJlZShwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlcik7CisgICAgICAgIGlmIChwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgIT0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZSkgeworICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5lcnJvclBvcyA9IHBTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkOworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRmluYWxpemUgdGhlIGRhdGEgc2lnbmF0dXJlLgorICAgICAgICAgICAgc2l6ZV90IHNpZ25hdHVyZVNpemU7CisgICAgICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25hdHVyZVNpemUpOworICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVNpemUgIT0gU0hBMV9IQVNIX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGhlYWRlciBzaWduYXR1cmUsIHdoaWNoIGlzIGEgc2lnbmF0dXJlIG9mIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIGRhdGEgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBOVUxMLCBLRVlfU0laRSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCAodW5zaWduZWQgY2hhciAqKXBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgICAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCAmcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZXNbc2lnbmF0dXJlU2l6ZV0sICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlU2l6ZSAhPSBTSEExX0hBU0hfU0laRSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldCA9IFRPUF9IRUFERVJfU0laRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCArIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5lcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICB9CisgICAgICAgIGZyZWUocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0cik7CisgICAgICAgIGZyZWUocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0cik7CisgICAgICAgIGZyZWUocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5KTsKKyAgICAgICAgSE1BQ19DVFhfY2xlYW51cCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0KTsKKyAgICAgICAgRndkTG9ja0NvbnZfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydE9wZW5GaWxlKGludCBpbnB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1JlYWRGdW5jX3QgKmZwUmVhZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1dyaXRlRnVuY190ICpmcFdyaXRlRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9MU2Vla0Z1bmNfdCAqZnBMU2Vla0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAqcEVycm9yUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgfQorICAgIGlmIChmcFJlYWRGdW5jID09IE5VTEwgfHwgZnBXcml0ZUZ1bmMgPT0gTlVMTCB8fCBmcExTZWVrRnVuYyA9PSBOVUxMIHx8IGlucHV0RmlsZURlc2MgPCAwIHx8CisgICAgICAgIG91dHB1dEZpbGVEZXNjIDwgMCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKnBSZWFkQnVmZmVyID0gbWFsbG9jKFJFQURfQlVGRkVSX1NJWkUpOworICAgICAgICBpZiAocFJlYWRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHNlc3Npb25JZDsKKyAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90IG91dHB1dDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKCZzZXNzaW9uSWQsICZvdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBjbG9zZVN0YXR1czsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBmcFJlYWRGdW5jKGlucHV0RmlsZURlc2MsIHBSZWFkQnVmZmVyLCBSRUFEX0JVRkZFUl9TSVpFKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhKHNlc3Npb25JZCwgcFJlYWRCdWZmZXIsIChzaXplX3QpbnVtQnl0ZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQuZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1dyaXR0ZW4gPSBmcFdyaXRlRnVuYyhvdXRwdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1CeXRlc1dyaXR0ZW4gIT0gKHNzaXplX3Qpb3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yICYmIHBFcnJvclBvcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBFcnJvclBvcyA9IG91dHB1dC5mcm9tQ29udmVydERhdGEuZXJyb3JQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlCisgICAgICAgICAgICAgICAgaWYgKG51bUJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlU3RhdHVzID0gRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uKHNlc3Npb25JZCwgJm91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlU3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlU3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvciAmJiBwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRXJyb3JQb3MgPSBvdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5lcnJvclBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNsb3NlU3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZwTFNlZWtGdW5jKG91dHB1dEZpbGVEZXNjLCBvdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5maWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZwV3JpdGVGdW5jKG91dHB1dEZpbGVEZXNjLCBvdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5zaWduYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRSkgIT0gRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBSZWFkQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RmlsZShjb25zdCBjaGFyICpwSW5wdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBPdXRwdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcykgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgIH0KKyAgICBpZiAocElucHV0RmlsZW5hbWUgPT0gTlVMTCB8fCBwT3V0cHV0RmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpbnB1dEZpbGVEZXNjID0gb3BlbihwSW5wdXRGaWxlbmFtZSwgT19SRE9OTFkpOworICAgICAgICBpZiAoaW5wdXRGaWxlRGVzYyA8IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlTm90Rm91bmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgb3V0cHV0RmlsZURlc2MgPSBvcGVuKHBPdXRwdXRGaWxlbmFtZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RmlsZURlc2MgPCAwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVDcmVhdGlvbkZhaWxlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfQ29udmVydE9wZW5GaWxlKGlucHV0RmlsZURlc2MsIHJlYWQsIG91dHB1dEZpbGVEZXNjLCB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNlZWs2NCwgcEVycm9yUG9zKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xvc2Uob3V0cHV0RmlsZURlc2MpID09IDAgJiYgc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICByZW1vdmUocE91dHB1dEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCljbG9zZShpbnB1dEZpbGVEZXNjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBjMGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmgKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRldETE9DS0NPTlZfSF9fCisjZGVmaW5lIF9fRldETE9DS0NPTlZfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKioKKyAqIFRoZSBzaXplIG9mIHRoZSBkYXRhIGFuZCBoZWFkZXIgc2lnbmF0dXJlcyBjb21iaW5lZC4gVGhlIHNpZ25hdHVyZXMgYXJlIGFkamFjZW50IHRvIGVhY2ggb3RoZXIgaW4KKyAqIHRoZSBwcm9kdWNlZCBvdXRwdXQgZmlsZS4KKyAqLworI2RlZmluZSBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkUgKDIgKiAyMCkKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBvdXRwdXQgZnJvbSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfQ29udmVydERhdGFfT3V0cHV0IHsKKyAgICAvLy8gVGhlIGNvbnZlcnRlZCBkYXRhLgorICAgIHZvaWQgKnBCdWZmZXI7CisKKyAgICAvLy8gVGhlIHNpemUgb2YgdGhlIGNvbnZlcnRlZCBkYXRhLgorICAgIHNpemVfdCBudW1CeXRlczsKKworICAgIC8vLyBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLgorICAgIG9mZjY0X3QgZXJyb3JQb3M7Cit9IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhX091dHB1dF90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIG91dHB1dCBmcm9tIEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uX091dHB1dCB7CisgICAgLy8vIFRoZSBmaW5hbCBzZXQgb2Ygc2lnbmF0dXJlcy4KKyAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZXNbRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFXTsKKworICAgIC8vLyBUaGUgb2Zmc2V0IGluIHRoZSBwcm9kdWNlZCBvdXRwdXQgZmlsZSB3aGVyZSB0aGUgc2lnbmF0dXJlcyBhcmUgbG9jYXRlZC4KKyAgICBvZmY2NF90IGZpbGVPZmZzZXQ7CisKKyAgICAvLy8gVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4KKyAgICBvZmY2NF90IGVycm9yUG9zOworfSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb25fT3V0cHV0X3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqLwordHlwZWRlZiB1bmlvbiBGd2RMb2NrQ29udl9PdXRwdXQgeworICAgIEZ3ZExvY2tDb252X0NvbnZlcnREYXRhX091dHB1dF90IGZyb21Db252ZXJ0RGF0YTsKKyAgICBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb25fT3V0cHV0X3QgZnJvbUNsb3NlU2Vzc2lvbjsKK30gRndkTG9ja0NvbnZfT3V0cHV0X3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgUG9zaXgtc3R5bGUgcmVhZCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBjb252ZXJ0ZXIgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhIGZpbGUgb3BlbmVkIGZvciByZWFkaW5nLgorICogQHBhcmFtW291dF0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCit0eXBlZGVmIHNzaXplX3QgRndkTG9ja0NvbnZfUmVhZEZ1bmNfdChpbnQgZmlsZURlc2MsIHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgUG9zaXgtc3R5bGUgd3JpdGUgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAqIEBwYXJhbVtpbl0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90IEZ3ZExvY2tDb252X1dyaXRlRnVuY190KGludCBmaWxlRGVzYywgY29uc3Qgdm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKTsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBQb3NpeC1zdHlsZSBsc2VlayBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBjb252ZXJ0ZXIgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhIGZpbGUgb3BlbmVkIGZvciB3cml0aW5nLgorICogQHBhcmFtW2luXSBvZmZzZXQgVGhlIG9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqIEBwYXJhbVtpbl0gd2hlbmNlIE9uZSBvZiBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORC4KKyAqCisgKiBAcmV0dXJuIFRoZSBuZXcgZmlsZSBwb3NpdGlvbi4KKyAqIEByZXR2YWwgKChvZmY2NF90KS0xKSBGYWlsdXJlLgorICovCit0eXBlZGVmIG9mZjY0X3QgRndkTG9ja0NvbnZfTFNlZWtGdW5jX3QoaW50IGZpbGVEZXNjLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSk7CisKKy8qKgorICogVGhlIHN0YXR1cyBjb2RlcyByZXR1cm5lZCBieSB0aGUgY29udmVydGVyIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X1N0YXR1cyB7CisgICAgLy8vIFRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX09LID0gMCwKKworICAgIC8vLyBBbiBhY3R1YWwgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uIGlzIGludmFsaWQgKGEgcHJvZ3JhbSBlcnJvciBvbiB0aGUgY2FsbGVyJ3MgcGFydCkuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudCA9IDEsCisKKyAgICAvLy8gVGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIGR5bmFtaWMgbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5ID0gMiwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nIHRoZSBpbnB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlTm90Rm91bmQgPSAzLAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZUNyZWF0aW9uRmFpbGVkID0gNCwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZyb20gdGhlIGlucHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3IgPSA1LAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvciA9IDYsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2Vla2luZyB0byBhIG5ldyBmaWxlIHBvc2l0aW9uIHdpdGhpbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVTZWVrRXJyb3IgPSA3LAorCisgICAgLy8vIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvciA9IDgsCisKKyAgICAvLy8gU3VwcG9ydCBmb3IgdGhpcyBEUk0gZmlsZSBmb3JtYXQgaGFzIGJlZW4gZGlzYWJsZWQgaW4gdGhlIGN1cnJlbnQgcHJvZHVjdCBjb25maWd1cmF0aW9uLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQgPSA5LAorCisgICAgLy8vIFRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIGlzIG5vdCBvbmUgb2YgImJpbmFyeSIsICJiYXNlNjQiLCAiN2JpdCIsIG9yICI4Yml0IgorICAgIC8vLyAoY2FzZS1pbnNlbnNpdGl2ZSkuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSAxMCwKKworICAgIC8vLyBUaGUgZ2VuZXJhdGlvbiBvZiBhIHJhbmRvbSBudW1iZXIgZmFpbGVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkID0gMTEsCisKKyAgICAvLy8gS2V5IGVuY3J5cHRpb24gZmFpbGVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkID0gMTIsCisKKyAgICAvLy8gVGhlIGNhbGN1bGF0aW9uIG9mIGEga2V5ZWQgaGFzaCBmb3IgaW50ZWdyaXR5IHByb3RlY3Rpb24gZmFpbGVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkID0gMTMsCisKKyAgICAvLy8gVGhlcmUgYXJlIHRvbyBtYW55IG9uZ29pbmcgc2Vzc2lvbnMgZm9yIGFub3RoZXIgb25lIHRvIGJlIG9wZW5lZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zID0gMTQsCisKKyAgICAvLy8gQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yID0gMTUKK30gRndkTG9ja0NvbnZfU3RhdHVzX3Q7CisKKy8qKgorICogT3BlbnMgYSBzZXNzaW9uIGZvciBjb252ZXJ0aW5nIGFuIE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUgdG8gdGhlIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlCisgKiBmb3JtYXQuCisgKgorICogQHBhcmFtW291dF0gcFNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KKyAqIEBwYXJhbVtvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MgKGluaXRpYWxpemVkKS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnMKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfT3BlblNlc3Npb24oaW50ICpwU2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCk7CisKKy8qKgorICogU3VwcGxpZXMgdGhlIGNvbnZlcnRlciB3aXRoIGRhdGEgdG8gY29udmVydC4gVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB3cml0ZSB0aGUgY29udmVydGVkIGRhdGEKKyAqIHRvIGZpbGUuIENhbiBiZSBjYWxsZWQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0aW1lcy4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KKyAqIEBwYXJhbVtpbl0gcEJ1ZmZlciBBIHJlZmVyZW5jZSB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbnZlcnQuCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydC4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MgKGFsbG9jYXRlZC9yZWFsbG9jYXRlZCkuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0RhdGFFbmNyeXB0aW9uRmFpbGVkCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhKGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpOworCisvKioKKyAqIENsb3NlcyBhIHNlc3Npb24gZm9yIGNvbnZlcnRpbmcgYW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrCisgKiBmaWxlIGZvcm1hdC4gVGhlIGNhbGxlciBtdXN0IHVwZGF0ZSB0aGUgcHJvZHVjZWQgb3V0cHV0IGZpbGUgYXQgdGhlIGluZGljYXRlZCBmaWxlIG9mZnNldCB3aXRoCisgKiB0aGUgZmluYWwgc2V0IG9mIHNpZ25hdHVyZXMuCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gSUQuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzIChkZWFsbG9jYXRlZCBhbmQgb3ZlcndyaXR0ZW4pLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihpbnQgc2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCk7CisKKy8qKgorICogQ29udmVydHMgYW4gb3BlbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaW4gcHVsbAorICogbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGlucHV0RmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3BlbiBpbnB1dCBmaWxlLgorICogQHBhcmFtW2luXSBmcFJlYWRGdW5jIEEgcmVmZXJlbmNlIHRvIGEgcmVhZCBmdW5jdGlvbiB0aGF0IGNhbiBvcGVyYXRlIG9uIHRoZSBvcGVuIGlucHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIG91dHB1dEZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG9wZW4gb3V0cHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIGZwV3JpdGVGdW5jIEEgcmVmZXJlbmNlIHRvIGEgd3JpdGUgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiB0aGUgb3BlbiBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbVtpbl0gZnBMU2Vla0Z1bmMgQSByZWZlcmVuY2UgdG8gYW4gbHNlZWsgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiB0aGUgb3BlbiBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbVtvdXRdIHBFcnJvclBvcworICogICBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLiBNYXkgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVJlYWRFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVTZWVrRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0RhdGFFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnMKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydE9wZW5GaWxlKGludCBpbnB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1JlYWRGdW5jX3QgKmZwUmVhZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1dyaXRlRnVuY190ICpmcFdyaXRlRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9MU2Vla0Z1bmNfdCAqZnBMU2Vla0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKTsKKworLyoqCisgKiBDb252ZXJ0cyBhbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gcElucHV0RmlsZW5hbWUgQSByZWZlcmVuY2UgdG8gdGhlIGlucHV0IGZpbGVuYW1lLgorICogQHBhcmFtW2luXSBwT3V0cHV0RmlsZW5hbWUgQSByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBmaWxlbmFtZS4KKyAqIEBwYXJhbVtvdXRdIHBFcnJvclBvcworICogICBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLiBNYXkgYmUgTlVMTC4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZU5vdEZvdW5kCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlQ3JlYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19EYXRhRW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRGaWxlKGNvbnN0IGNoYXIgKnBJbnB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcE91dHB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9fRldETE9DS0NPTlZfSF9fCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyNWVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBGd2RMb2NrRmlsZS5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNyeXB0bworCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfTU9EVUxFIDo9IGxpYmZ3ZGxvY2stZGVjb2RlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmMgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyODRlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmMKQEAgLTAsMCArMSw0NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCisjaW5jbHVkZSAiRndkTG9ja0ZpbGUuaCIKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKKyNkZWZpbmUgSU5WQUxJRF9PRkZTRVQgKChvZmY2NF90KS0xKQorCisjZGVmaW5lIElOVkFMSURfQkxPQ0tfSU5ERVggKCh1aW50NjRfdCktMSkKKworI2RlZmluZSBNQVhfTlVNX1NFU1NJT05TIDEyOAorCisjZGVmaW5lIEtFWV9TSVpFIEFFU19CTE9DS19TSVpFCisjZGVmaW5lIEtFWV9TSVpFX0lOX0JJVFMgKEtFWV9TSVpFICogOCkKKworI2RlZmluZSBTSEExX0hBU0hfU0laRSAyMAorI2RlZmluZSBTSEExX0JMT0NLX1NJWkUgNjQKKworI2RlZmluZSBGV0RfTE9DS19WRVJTSU9OIDAKKyNkZWZpbmUgRldEX0xPQ0tfU1VCRk9STUFUIDAKKyNkZWZpbmUgVVNBR0VfUkVTVFJJQ1RJT05fRkxBR1MgMAorI2RlZmluZSBDT05URU5UX1RZUEVfTEVOR1RIX1BPUyA3CisjZGVmaW5lIFRPUF9IRUFERVJfU0laRSA4CisKKyNkZWZpbmUgU0lHX0NBTENfQlVGRkVSX1NJWkUgKDE2ICogU0hBMV9CTE9DS19TSVpFKQorCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHBlci1maWxlIHN0YXRlIGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgZGVjb2Rlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0ZpbGVfU2Vzc2lvbiB7CisgICAgaW50IGZpbGVEZXNjOworICAgIHVuc2lnbmVkIGNoYXIgdG9wSGVhZGVyW1RPUF9IRUFERVJfU0laRV07CisgICAgY2hhciAqcENvbnRlbnRUeXBlOworICAgIHNpemVfdCBjb250ZW50VHlwZUxlbmd0aDsKKyAgICB2b2lkICpwRW5jcnlwdGVkU2Vzc2lvbktleTsKKyAgICBzaXplX3QgZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGFTaWduYXR1cmVbU0hBMV9IQVNIX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyU2lnbmF0dXJlW1NIQTFfSEFTSF9TSVpFXTsKKyAgICBvZmY2NF90IGRhdGFPZmZzZXQ7CisgICAgb2ZmNjRfdCBmaWxlUG9zOworICAgIEFFU19LRVkgZW5jcnlwdGlvblJvdW5kS2V5czsKKyAgICBITUFDX0NUWCBzaWduaW5nQ29udGV4dDsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVN0cmVhbVtBRVNfQkxPQ0tfU0laRV07CisgICAgdWludDY0X3QgYmxvY2tJbmRleDsKK30gRndkTG9ja0ZpbGVfU2Vzc2lvbl90OworCitzdGF0aWMgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpzZXNzaW9uUHRyc1tNQVhfTlVNX1NFU1NJT05TXSA9IHsgTlVMTCB9OworCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHNlc3Npb25BY3F1aXNpdGlvbk11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdG9wSGVhZGVyVGVtcGxhdGVbXSA9CisgICAgeyAnRicsICdXJywgJ0wnLCAnSycsIEZXRF9MT0NLX1ZFUlNJT04sIEZXRF9MT0NLX1NVQkZPUk1BVCwgVVNBR0VfUkVTVFJJQ1RJT05fRkxBR1MgfTsKKworLyoqCisgKiBBY3F1aXJlcyBhbiB1bnVzZWQgZmlsZSBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgQSBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHJldHVybiBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0ZpbGVfQWNxdWlyZVNlc3Npb24oaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHNlc3Npb25JZCA9IC0xOworICAgIGlmIChmaWxlRGVzYyA8IDApIHsKKyAgICAgICAgZXJybm8gPSBFQkFERjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1NFU1NJT05TOyArK2kpIHsKKyAgICAgICAgICAgIGludCBjYW5kaWRhdGVTZXNzaW9uSWQgPSAoZmlsZURlc2MgKyBpKSAlIE1BWF9OVU1fU0VTU0lPTlM7CisgICAgICAgICAgICBpZiAoc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXSA9IG1hbGxvYyhzaXplb2YgKipzZXNzaW9uUHRycyk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdLT5maWxlRGVzYyA9IGZpbGVEZXNjOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdLT5wQ29udGVudFR5cGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNhbmRpZGF0ZVNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICAgICAgaWYgKGkgPT0gTUFYX05VTV9TRVNTSU9OUykgeworICAgICAgICAgICAgZXJybm8gPSBFTkZJTEU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlc3Npb25JZDsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgZmlsZSBzZXNzaW9uIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIEEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEByZXR1cm4gQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICBpZiAoZmlsZURlc2MgPCAwKSB7CisgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVNTSU9OUzsgKytpKSB7CisgICAgICAgICAgICBpbnQgY2FuZGlkYXRlU2Vzc2lvbklkID0gKGZpbGVEZXNjICsgaSkgJSBNQVhfTlVNX1NFU1NJT05TOworICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0tPmZpbGVEZXNjID09IGZpbGVEZXNjKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gY2FuZGlkYXRlU2Vzc2lvbklkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgICAgIGlmIChpID09IE1BWF9OVU1fU0VTU0lPTlMpIHsKKyAgICAgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlc3Npb25JZDsKK30KKworLyoqCisgKiBSZWxlYXNlcyBhIGZpbGUgc2Vzc2lvbi4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JRCBBIHNlc3Npb24gSUQuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tGaWxlX1JlbGVhc2VTZXNzaW9uKGludCBzZXNzaW9uSWQpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICBhc3NlcnQoMCA8PSBzZXNzaW9uSWQgJiYgc2Vzc2lvbklkIDwgTUFYX05VTV9TRVNTSU9OUyAmJiBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdICE9IE5VTEwpOworICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlKTsKKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5KTsKKyAgICBtZW1zZXQoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSwgMCwgc2l6ZW9mICpzZXNzaW9uUHRyc1tzZXNzaW9uSWRdKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgZnJlZShzZXNzaW9uUHRyc1tzZXNzaW9uSWRdKTsKKyAgICBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdID0gTlVMTDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworfQorCisvKioKKyAqIERlcml2ZXMga2V5cyBmb3IgZW5jcnlwdGlvbiBhbmQgc2lnbmluZyBmcm9tIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBmaWxlIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGtleSBkZXJpdmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tGaWxlX0Rlcml2ZUtleXMoRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICogcFNlc3Npb24pIHsKKyAgICBpbnQgcmVzdWx0OworICAgIHN0cnVjdCBGd2RMb2NrRmlsZV9EZXJpdmVLZXlzX0RhdGEgeworICAgICAgICBBRVNfS0VZIHNlc3Npb25Sb3VuZEtleXM7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWVbS0VZX1NJWkVdOworICAgICAgICB1bnNpZ25lZCBjaGFyIGtleVtLRVlfU0laRV07CisgICAgfSAqcERhdGEgPSBtYWxsb2Moc2l6ZW9mICpwRGF0YSk7CisgICAgaWYgKHBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gRndkTG9ja0dsdWVfRGVjcnlwdEtleShwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgsIHBEYXRhLT5rZXksIEtFWV9TSVpFKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocERhdGEtPmtleSwgS0VZX1NJWkVfSU5fQklUUywgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgdGhlIDE2LWJ5dGUgdmFsdWUgezAsIDAsIC4uLiwgMH0gdG8gcHJvZHVjZSB0aGUgZW5jcnlwdGlvbiBrZXkuCisgICAgICAgICAgICAgICAgbWVtc2V0KHBEYXRhLT52YWx1ZSwgMCwgS0VZX1NJWkUpOworICAgICAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShwRGF0YS0+a2V5LCBLRVlfU0laRV9JTl9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU2Vzc2lvbi0+ZW5jcnlwdGlvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHsxLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIHNpZ25pbmcga2V5LgorICAgICAgICAgICAgICAgICAgICArK3BEYXRhLT52YWx1ZVswXTsKKyAgICAgICAgICAgICAgICAgICAgQUVTX2VuY3J5cHQocERhdGEtPnZhbHVlLCBwRGF0YS0+a2V5LCAmcERhdGEtPnNlc3Npb25Sb3VuZEtleXMpOworICAgICAgICAgICAgICAgICAgICBITUFDX0NUWF9pbml0KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcERhdGEtPmtleSwgS0VZX1NJWkUsIEVWUF9zaGExKCksIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgZXJybm8gPSBFTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHBEYXRhLCAwLCBzaXplb2YgcERhdGEpOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICAgICAgZnJlZShwRGF0YSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlcyB0aGUgY291bnRlciwgdHJlYXRlZCBhcyBhIDE2LWJ5dGUgbGl0dGxlLWVuZGlhbiBudW1iZXIsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGtleXN0cmVhbQorICogZm9yIHRoZSBnaXZlbiBibG9jay4KKyAqCisgKiBAcGFyYW1baW5dIHBOb25jZSBBIHJlZmVyZW5jZSB0byB0aGUgbm9uY2UuCisgKiBAcGFyYW1baW5dIGJsb2NrSW5kZXggVGhlIGluZGV4IG51bWJlciBvZiB0aGUgYmxvY2suCisgKiBAcGFyYW1bb3V0XSBwQ291bnRlciBBIHJlZmVyZW5jZSB0byB0aGUgY291bnRlci4KKyAqLworc3RhdGljIHZvaWQgRndkTG9ja0ZpbGVfQ2FsY3VsYXRlQ291bnRlcihjb25zdCB1bnNpZ25lZCBjaGFyICpwTm9uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBDb3VudGVyKSB7CisgICAgdW5zaWduZWQgY2hhciBjYXJyeSA9IDA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoOyBpIDwgc2l6ZW9mIGJsb2NrSW5kZXg7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHBhcnQgPSBwTm9uY2VbaV0gKyAodW5zaWduZWQgY2hhcikoYmxvY2tJbmRleCA+PiAoaSAqIENIQVJfQklUKSk7CisgICAgICAgIHBDb3VudGVyW2ldID0gcGFydCArIGNhcnJ5OworICAgICAgICBjYXJyeSA9IChwYXJ0IDwgcE5vbmNlW2ldIHx8IHBDb3VudGVyW2ldIDwgcGFydCkgPyAxIDogMDsKKyAgICB9CisgICAgZm9yICg7IGkgPCBBRVNfQkxPQ0tfU0laRTsgKytpKSB7CisgICAgICAgIHBDb3VudGVyW2ldID0gcE5vbmNlW2ldICsgY2Fycnk7CisgICAgICAgIGNhcnJ5ID0gKHBDb3VudGVyW2ldIDwgcE5vbmNlW2ldKSA/IDEgOiAwOworICAgIH0KK30KKworLyoqCisgKiBEZWNyeXB0cyB0aGUgYnl0ZSBhdCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIHVzaW5nIEFFUy0xMjgtQ1RSLiBJbiBDVFIgKG9yICJjb3VudGVyIikgbW9kZSwKKyAqIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gYXJlIHBlcmZvcm1lZCB1c2luZyB0aGUgc2FtZSBhbGdvcml0aG0uCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBmaWxlIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIHBCeXRlIFRoZSBieXRlIHRvIGRlY3J5cHQuCisgKi8KK3ZvaWQgRndkTG9ja0ZpbGVfRGVjcnlwdEJ5dGUoRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICogcFNlc3Npb24sIHVuc2lnbmVkIGNoYXIgKnBCeXRlKSB7CisgICAgdWludDY0X3QgYmxvY2tJbmRleCA9IHBTZXNzaW9uLT5maWxlUG9zIC8gQUVTX0JMT0NLX1NJWkU7CisgICAgdWludDY0X3QgYmxvY2tPZmZzZXQgPSBwU2Vzc2lvbi0+ZmlsZVBvcyAlIEFFU19CTE9DS19TSVpFOworICAgIGlmIChibG9ja0luZGV4ICE9IHBTZXNzaW9uLT5ibG9ja0luZGV4KSB7CisgICAgICAgIC8vIFRoZSBmaXJzdCAxNiBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGlzIHVzZWQgYXMgdGhlIG5vbmNlLgorICAgICAgICB1bnNpZ25lZCBjaGFyIGNvdW50ZXJbQUVTX0JMT0NLX1NJWkVdOworICAgICAgICBGd2RMb2NrRmlsZV9DYWxjdWxhdGVDb3VudGVyKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwgYmxvY2tJbmRleCwgY291bnRlcik7CisgICAgICAgIEFFU19lbmNyeXB0KGNvdW50ZXIsIHBTZXNzaW9uLT5rZXlTdHJlYW0sICZwU2Vzc2lvbi0+ZW5jcnlwdGlvblJvdW5kS2V5cyk7CisgICAgICAgIHBTZXNzaW9uLT5ibG9ja0luZGV4ID0gYmxvY2tJbmRleDsKKyAgICB9CisgICAgKnBCeXRlIF49IHBTZXNzaW9uLT5rZXlTdHJlYW1bYmxvY2tPZmZzZXRdOworfQorCitpbnQgRndkTG9ja0ZpbGVfYXR0YWNoKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9BY3F1aXJlU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA+PSAwKSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBpbnQgaXNTdWNjZXNzID0gRkFMU0U7CisgICAgICAgIGlmIChyZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+dG9wSGVhZGVyLCBUT1BfSEVBREVSX1NJWkUpID09IFRPUF9IRUFERVJfU0laRSAmJgorICAgICAgICAgICAgICAgIG1lbWNtcChwU2Vzc2lvbi0+dG9wSGVhZGVyLCB0b3BIZWFkZXJUZW1wbGF0ZSwgc2l6ZW9mIHRvcEhlYWRlclRlbXBsYXRlKSA9PSAwKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGggPSBwU2Vzc2lvbi0+dG9wSGVhZGVyW0NPTlRFTlRfVFlQRV9MRU5HVEhfUE9TXTsKKyAgICAgICAgICAgIGFzc2VydChwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGggPD0gVUNIQVJfTUFYKTsgLy8gVW50YWludCBzY2FsYXIgZm9yIGNvZGUgY2hlY2tlcnMuCisgICAgICAgICAgICBwU2Vzc2lvbi0+cENvbnRlbnRUeXBlID0gbWFsbG9jKHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCArIDEpOworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5wQ29udGVudFR5cGUgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICByZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+cENvbnRlbnRUeXBlLCBwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzaXplX3QpcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBDb250ZW50VHlwZVtwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCA9IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChLRVlfU0laRSk7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5ID0gbWFsbG9jKHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQoZmlsZURlc2MsIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KXBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+ZGF0YVNpZ25hdHVyZSwgU0hBMV9IQVNIX1NJWkUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFICYmCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+aGVhZGVyU2lnbmF0dXJlLCBTSEExX0hBU0hfU0laRSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBMV9IQVNIX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNTdWNjZXNzID0gRndkTG9ja0ZpbGVfRGVyaXZlS2V5cyhwU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc1N1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ID0gcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggKyBUT1BfSEVBREVSX1NJWkUgKyAyICogU0hBMV9IQVNIX1NJWkU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZmlsZVBvcyA9IDA7CisgICAgICAgICAgICBwU2Vzc2lvbi0+YmxvY2tJbmRleCA9IElOVkFMSURfQkxPQ0tfSU5ERVg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGd2RMb2NrRmlsZV9SZWxlYXNlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgc2Vzc2lvbklkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChzZXNzaW9uSWQgPj0gMCkgPyAwIDogLTE7Cit9CisKK2ludCBGd2RMb2NrRmlsZV9vcGVuKGNvbnN0IGNoYXIgKnBGaWxlbmFtZSkgeworICAgIGludCBmaWxlRGVzYyA9IG9wZW4ocEZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZpbGVEZXNjID49IDAgJiYgRndkTG9ja0ZpbGVfYXR0YWNoKGZpbGVEZXNjKSA8IDApIHsKKyAgICAgICAgKHZvaWQpY2xvc2UoZmlsZURlc2MpOworICAgICAgICBmaWxlRGVzYyA9IC0xOworICAgIH0KKyAgICByZXR1cm4gZmlsZURlc2M7Cit9CisKK3NzaXplX3QgRndkTG9ja0ZpbGVfcmVhZChpbnQgZmlsZURlc2MsIHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcykgeworICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkOworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgbnVtQnl0ZXNSZWFkID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIHNzaXplX3QgaTsKKyAgICAgICAgbnVtQnl0ZXNSZWFkID0gcmVhZChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBCdWZmZXIsIG51bUJ5dGVzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJ5dGVzUmVhZDsgKytpKSB7CisgICAgICAgICAgICBGd2RMb2NrRmlsZV9EZWNyeXB0Qnl0ZShwU2Vzc2lvbiwgJigodW5zaWduZWQgY2hhciAqKXBCdWZmZXIpW2ldKTsKKyAgICAgICAgICAgICsrcFNlc3Npb24tPmZpbGVQb3M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworb2ZmNjRfdCBGd2RMb2NrRmlsZV9sc2VlayhpbnQgZmlsZURlc2MsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CisgICAgb2ZmNjRfdCBuZXdGaWxlUG9zOworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgbmV3RmlsZVBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBzd2l0Y2ggKHdoZW5jZSkgeworICAgICAgICBjYXNlIFNFRUtfU0VUOgorICAgICAgICAgICAgbmV3RmlsZVBvcyA9IGxzZWVrNjQocFNlc3Npb24tPmZpbGVEZXNjLCBwU2Vzc2lvbi0+ZGF0YU9mZnNldCArIG9mZnNldCwgd2hlbmNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBjYXNlIFNFRUtfRU5EOgorICAgICAgICAgICAgbmV3RmlsZVBvcyA9IGxzZWVrNjQocFNlc3Npb24tPmZpbGVEZXNjLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgbmV3RmlsZVBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ld0ZpbGVQb3MgIT0gSU5WQUxJRF9PRkZTRVQpIHsKKyAgICAgICAgICAgIGlmIChuZXdGaWxlUG9zIDwgcFNlc3Npb24tPmRhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbmV3IGZpbGUgcG9zaXRpb24gaXMgaWxsZWdhbCBmb3IgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUuIFJlc3RvcmUgdGhlCisgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgZmlsZSBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAodm9pZClsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgcFNlc3Npb24tPmRhdGFPZmZzZXQgKyBwU2Vzc2lvbi0+ZmlsZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgICAgICBuZXdGaWxlUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIHRoZSBmaWxlIHBvc2l0aW9uIHRoYXQgbHNlZWs2NCgpIHdvdWxkIGhhdmUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGVtYmVkZGVkIGNvbnRlbnQgZmlsZS4KKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZmlsZVBvcyA9IG5ld0ZpbGVQb3MgLSBwU2Vzc2lvbi0+ZGF0YU9mZnNldDsKKyAgICAgICAgICAgICAgICBuZXdGaWxlUG9zID0gcFNlc3Npb24tPmZpbGVQb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ld0ZpbGVQb3M7Cit9CisKK2ludCBGd2RMb2NrRmlsZV9kZXRhY2goaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEhNQUNfQ1RYX2NsZWFudXAoJnNlc3Npb25QdHJzW3Nlc3Npb25JZF0tPnNpZ25pbmdDb250ZXh0KTsKKyAgICBGd2RMb2NrRmlsZV9SZWxlYXNlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIHJldHVybiAwOworfQorCitpbnQgRndkTG9ja0ZpbGVfY2xvc2UoaW50IGZpbGVEZXNjKSB7CisgICAgcmV0dXJuIChGd2RMb2NrRmlsZV9kZXRhY2goZmlsZURlc2MpID09IDApID8gY2xvc2UoZmlsZURlc2MpIDogLTE7Cit9CisKK2ludCBGd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCBGd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHlfRGF0YSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltTSUdfQ0FMQ19CVUZGRVJfU0laRV07CisgICAgICAgIH0gKnBEYXRhID0gbWFsbG9jKHNpemVvZiAqcERhdGEpOworICAgICAgICBpZiAocERhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgICAgIGlmIChsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgcFNlc3Npb24tPmRhdGFPZmZzZXQsIFNFRUtfU0VUKSAhPQorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2lnbmF0dXJlU2l6ZSA9IFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgICAgIHdoaWxlICgobnVtQnl0ZXNSZWFkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQocFNlc3Npb24tPmZpbGVEZXNjLCBwRGF0YS0+YnVmZmVyLCBTSUdfQ0FMQ19CVUZGRVJfU0laRSkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwRGF0YS0+YnVmZmVyLCAoc2l6ZV90KW51bUJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChudW1CeXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEhNQUNfRmluYWwoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcERhdGEtPnNpZ25hdHVyZSwgJnNpZ25hdHVyZVNpemUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc2lnbmF0dXJlU2l6ZSA9PSBTSEExX0hBU0hfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1lbWNtcChwRGF0YS0+c2lnbmF0dXJlLCBwU2Vzc2lvbi0+ZGF0YVNpZ25hdHVyZSwgc2lnbmF0dXJlU2l6ZSkgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIE5VTEwsIEtFWV9TSVpFLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAodm9pZClsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgcFNlc3Npb24tPmRhdGFPZmZzZXQgKyBwU2Vzc2lvbi0+ZmlsZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocERhdGEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eShpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NIQTFfSEFTSF9TSVpFXTsKKyAgICAgICAgc2l6ZV90IHNpZ25hdHVyZVNpemUgPSBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKTsKKyAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgKHVuc2lnbmVkIGNoYXIgKilwU2Vzc2lvbi0+cENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGgpOworICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKyAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIHNpZ25hdHVyZVNpemUpOworICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHNpZ25hdHVyZSwgJnNpZ25hdHVyZVNpemUpOworICAgICAgICBhc3NlcnQoc2lnbmF0dXJlU2l6ZSA9PSBTSEExX0hBU0hfU0laRSk7CisgICAgICAgIHJlc3VsdCA9IG1lbWNtcChzaWduYXR1cmUsIHBTZXNzaW9uLT5oZWFkZXJTaWduYXR1cmUsIHNpZ25hdHVyZVNpemUpID09IDA7CisgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBOVUxMLCBLRVlfU0laRSwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGd2RMb2NrRmlsZV9DaGVja0ludGVncml0eShpbnQgZmlsZURlc2MpIHsKKyAgICByZXR1cm4gRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoZmlsZURlc2MpICYmIEZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eShmaWxlRGVzYyk7Cit9CisKK2NvbnN0IGNoYXIgKkZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5wQ29udGVudFR5cGU7Cit9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2NDA1MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvRndkTG9ja0ZpbGUuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRklMRV9IX18KKyNkZWZpbmUgX19GV0RMT0NLRklMRV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qKgorICogQXR0YWNoZXMgdG8gYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4gVGhlIGZpbGUgcG9zaXRpb24gaXMgYXNzdW1lZCB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIDAgU3VjY2Vzcy4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX2F0dGFjaChpbnQgZmlsZURlc2MpOworCisvKioKKyAqIE9wZW5zIGEgRm9yd2FyZCBMb2NrIGZpbGUgZm9yIHJlYWRpbmcuCisgKgorICogQHBhcmFtW2luXSBwRmlsZW5hbWUgQSByZWZlcmVuY2UgdG8gYSBmaWxlbmFtZS4KKyAqCisgKiBAcmV0dXJuIEEgZmlsZSBkZXNjcmlwdG9yLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitpbnQgRndkTG9ja0ZpbGVfb3Blbihjb25zdCBjaGFyICpwRmlsZW5hbWUpOworCisvKioKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqIEBwYXJhbVtvdXRdIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworc3NpemVfdCBGd2RMb2NrRmlsZV9yZWFkKGludCBmaWxlRGVzYywgdm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKTsKKworLyoqCisgKiBVcGRhdGVzIHRoZSBmaWxlIHBvc2l0aW9uIHdpdGhpbiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICogQHBhcmFtW2luXSBvZmZzZXQgVGhlIG9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqIEBwYXJhbVtpbl0gd2hlbmNlIE9uZSBvZiBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORC4KKyAqCisgKiBAcmV0dXJuIFRoZSBuZXcgZmlsZSBwb3NpdGlvbi4KKyAqIEByZXR2YWwgKChvZmY2NF90KS0xKSBGYWlsdXJlLgorICovCitvZmY2NF90IEZ3ZExvY2tGaWxlX2xzZWVrKGludCBmaWxlRGVzYywgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpOworCisvKioKKyAqIERldGFjaGVzIGZyb20gYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIDAgU3VjY2Vzcy4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX2RldGFjaChpbnQgZmlsZURlc2MpOworCisvKioKKyAqIENsb3NlcyBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgMCBTdWNjZXNzLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitpbnQgRndkTG9ja0ZpbGVfY2xvc2UoaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBDaGVja3MgdGhlIGRhdGEgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBDaGVja3MgdGhlIGhlYWRlciBpbnRlZ3JpdHkgb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGludGVncml0eSBjaGVjayB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIGJvdGggdGhlIGRhdGEgYW5kIGhlYWRlciBpbnRlZ3JpdHkgb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGludGVncml0eSBjaGVjayB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tGaWxlX0NoZWNrSW50ZWdyaXR5KGludCBmaWxlRGVzYyk7CisKKy8qKgorICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybgorICogICBBIHJlZmVyZW5jZSB0byB0aGUgY29udGVudCB0eXBlLiBUaGUgcmVmZXJlbmNlIHJlbWFpbnMgdmFsaWQgYXMgbG9uZyBhcyB0aGUgZmlsZSBpcyBrZXB0IG9wZW4uCisgKi8KK2NvbnN0IGNoYXIgKkZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGludCBmaWxlRGVzYyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0ZXRExPQ0tGSUxFX0hfXwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGY5NWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKQEAgLTAsMCArMSwxMDM5IEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDEyIChmaWx0ZXJlZCkiPgorPHRpdGxlPkZvcndhcmQgTG9jayBDb252ZXJ0ZXIgYW5kIERlY29kZXI8L3RpdGxlPgorPHN0eWxlPgorPCEtLQorIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KKyBAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlNpbVN1bjsKKwlwYW5vc2UtMToyIDEgNiAwIDMgMSAxIDEgMSAxO30KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6IkNhbWJyaWEgTWF0aCI7CisJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OlRhaG9tYTsKKwlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iOworCXBhbm9zZS0xOjIgMTEgNiA5IDQgNSA0IDIgMiA0O30KK0Bmb250LWZhY2UKKwl7Zm9udC1mYW1pbHk6IlxAU2ltU3VuIjsKKwlwYW5vc2UtMToyIDEgNiAwIDMgMSAxIDEgMSAxO30KKyAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLworIHAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK2gxCisJe21hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWxlZnQ6MjEuNnB0OworCXRleHQtaW5kZW50Oi0yMS42cHQ7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwlmb250LXNpemU6MTYuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiO30KK2gyCisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDoyOC44cHQ7CisJdGV4dC1pbmRlbnQ6LTI4LjhwdDsKKwlwYWdlLWJyZWFrLWFmdGVyOmF2b2lkOworCWZvbnQtc2l6ZToxNC4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQoraDMKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjM2LjBwdDsKKwl0ZXh0LWluZGVudDotMzYuMHB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjEzLjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjt9CitoNAorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NDMuMnB0OworCXRleHQtaW5kZW50Oi00My4ycHQ7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwlmb250LXNpemU6MTQuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQoraDUKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjUwLjRwdDsKKwl0ZXh0LWluZGVudDotNTAuNHB0OworCWZvbnQtc2l6ZToxMy4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKKwlmb250LXN0eWxlOml0YWxpYzt9CitoNgorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NTcuNnB0OworCXRleHQtaW5kZW50Oi01Ny42cHQ7CisJZm9udC1zaXplOjExLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK3AuTXNvSGVhZGluZzcsIGxpLk1zb0hlYWRpbmc3LCBkaXYuTXNvSGVhZGluZzcKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjY0LjhwdDsKKwl0ZXh0LWluZGVudDotNjQuOHB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0hlYWRpbmc4LCBsaS5Nc29IZWFkaW5nOCwgZGl2Lk1zb0hlYWRpbmc4CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo3Mi4wcHQ7CisJdGV4dC1pbmRlbnQ6LTcyLjBwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQorcC5Nc29IZWFkaW5nOSwgbGkuTXNvSGVhZGluZzksIGRpdi5Nc29IZWFkaW5nOQorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NzkuMnB0OworCXRleHQtaW5kZW50Oi03OS4ycHQ7CisJZm9udC1zaXplOjExLjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjt9CitwLk1zb1RvYzEsIGxpLk1zb1RvYzEsIGRpdi5Nc29Ub2MxCisJe21hcmdpbi10b3A6Ni4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjYuMHB0OworCW1hcmdpbi1sZWZ0OjBjbTsKKwlsaW5lLWhlaWdodDoxNTAlOworCWZvbnQtc2l6ZToxMC41cHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKKwl0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitwLk1zb1RvYzIsIGxpLk1zb1RvYzIsIGRpdi5Nc29Ub2MyCisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6MTIuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlsaW5lLWhlaWdodDoxNTAlOworCWZvbnQtc2l6ZToxMC41cHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKKwlmb250LXZhcmlhbnQ6c21hbGwtY2Fwczt9CitwLk1zb1RvYzMsIGxpLk1zb1RvYzMsIGRpdi5Nc29Ub2MzCisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6MjQuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlsaW5lLWhlaWdodDoxNTAlOworCWZvbnQtc2l6ZToxMC41cHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKKwlmb250LXN0eWxlOml0YWxpYzt9CitwLk1zb1RvYzQsIGxpLk1zb1RvYzQsIGRpdi5Nc29Ub2M0CisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6MzYuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb1RvYzUsIGxpLk1zb1RvYzUsIGRpdi5Nc29Ub2M1CisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6NDguMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb1RvYzYsIGxpLk1zb1RvYzYsIGRpdi5Nc29Ub2M2CisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6NjAuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb1RvYzcsIGxpLk1zb1RvYzcsIGRpdi5Nc29Ub2M3CisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6NzIuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb1RvYzgsIGxpLk1zb1RvYzgsIGRpdi5Nc29Ub2M4CisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6ODQuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb1RvYzksIGxpLk1zb1RvYzksIGRpdi5Nc29Ub2M5CisJe21hcmdpbi10b3A6MGNtOworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTowY207CisJbWFyZ2luLWxlZnQ6OTYuMHB0OworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0Zvb3Rub3RlVGV4dCwgbGkuTXNvRm9vdG5vdGVUZXh0LCBkaXYuTXNvRm9vdG5vdGVUZXh0CisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMC4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0hlYWRlciwgbGkuTXNvSGVhZGVyLCBkaXYuTXNvSGVhZGVyCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0Zvb3RlciwgbGkuTXNvRm9vdGVyLCBkaXYuTXNvRm9vdGVyCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0NhcHRpb24sIGxpLk1zb0NhcHRpb24sIGRpdi5Nc29DYXB0aW9uCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsKKwlmb250LXdlaWdodDpib2xkO30KK3NwYW4uTXNvRm9vdG5vdGVSZWZlcmVuY2UKKwl7dmVydGljYWwtYWxpZ246c3VwZXI7fQorcC5Nc29UaXRsZSwgbGkuTXNvVGl0bGUsIGRpdi5Nc29UaXRsZQorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MTIwLjBwdDsKKwltYXJnaW4tbGVmdDowY207CisJdGV4dC1hbGlnbjpjZW50ZXI7CisJZm9udC1zaXplOjE2LjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjsKKwlmb250LXdlaWdodDpib2xkO30KK3AuTXNvQm9keVRleHQsIGxpLk1zb0JvZHlUZXh0LCBkaXYuTXNvQm9keVRleHQKKwl7bXNvLXN0eWxlLWxpbms6IkJvZHkgVGV4dCBDaGFyIjsKKwltYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206Ni4wcHQ7CisJbWFyZ2luLWxlZnQ6MGNtOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CithOmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rCisJe2NvbG9yOmJsdWU7CisJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CithOnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQKKwl7Y29sb3I6cHVycGxlOworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQorcC5Nc29BY2V0YXRlLCBsaS5Nc29BY2V0YXRlLCBkaXYuTXNvQWNldGF0ZQorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6OC4wcHQ7CisJZm9udC1mYW1pbHk6IlRhaG9tYSIsInNhbnMtc2VyaWYiO30KK3NwYW4uQm9keVRleHRDaGFyCisJe21zby1zdHlsZS1uYW1lOiJCb2R5IFRleHQgQ2hhciI7CisJbXNvLXN0eWxlLWxpbms6IkJvZHkgVGV4dCI7fQorIC8qIFBhZ2UgRGVmaW5pdGlvbnMgKi8KKyBAcGFnZSBXb3JkU2VjdGlvbjEKKwl7c2l6ZTo1OTUuNDVwdCA4NDEuN3B0OworCW1hcmdpbjo3Mi4wcHQgOTAuMHB0IDcyLjBwdCA5MC4wcHQ7fQorZGl2LldvcmRTZWN0aW9uMQorCXtwYWdlOldvcmRTZWN0aW9uMTt9CitAcGFnZSBXb3JkU2VjdGlvbjIKKwl7c2l6ZTo1OTUuNDVwdCA4NDEuN3B0OworCW1hcmdpbjo3Mi4wcHQgOTAuMHB0IDcyLjBwdCA5MC4wcHQ7fQorZGl2LldvcmRTZWN0aW9uMgorCXtwYWdlOldvcmRTZWN0aW9uMjt9CisgLyogTGlzdCBEZWZpbml0aW9ucyAqLworIG9sCisJe21hcmdpbi1ib3R0b206MGNtO30KK3VsCisJe21hcmdpbi1ib3R0b206MGNtO30KKy0tPgorPC9zdHlsZT4KKworPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+CisKKzxkaXYgY2xhc3M9V29yZFNlY3Rpb24xPgorCis8cCBjbGFzcz1Nc29UaXRsZT5Gb3J3YXJkIExvY2sgQ29udmVydGVyIEFuZCBEZWNvZGVyPC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuCitjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjIiPjE8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDsKK2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO2ZvbnQtd2VpZ2h0Om5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+SW50cm9kdWN0aW9uPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjM8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDIzIj4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+T3ZlcnZpZXc8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uLi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjM8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI0Ij4zPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+VXNlIENhc2VzPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+NDwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjUiPjMuMTxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+Q29udmVydGVyPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjQ8L3NwYW4+PC9hPjwvc3Bhbj48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MzPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyNiI+My4xLjE8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O2ZvbnQtc3R5bGU6bm9ybWFsOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKAgPC9zcGFuPkNvbnZlcnQgRGF0YSAoUHVzaC1Nb2RlIENvbnZlcnNpb24pPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz40PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MzPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyNyI+My4xLjI8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O2ZvbnQtc3R5bGU6bm9ybWFsOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKAgPC9zcGFuPkNvbnZlcnQgRmlsZSAoUHVsbC1Nb2RlIENvbnZlcnNpb24pPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz42PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MyPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48c3BhbiBzdHlsZT0nZm9udC12YXJpYW50Om5vcm1hbCAhaW1wb3J0YW50OwordGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyOCI+My4yPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToKKzEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LWRlY29yYXRpb246Citub25lJz6goKCgoKCgIDwvc3Bhbj5EZWNvZGVyPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjc8L3NwYW4+PC9hPjwvc3Bhbj48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MzPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyOSI+My4yLjE8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O2ZvbnQtc3R5bGU6bm9ybWFsOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKAgPC9zcGFuPkNoZWNrIEludGVncml0eTxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz44PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MzPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzMCI+My4yLjI8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O2ZvbnQtc3R5bGU6bm9ybWFsOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKAgPC9zcGFuPkdldCBDb250ZW50IFR5cGU8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+OTwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzEiPjMuMi4zPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5EZWNvZGUgRmlsZTxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMDwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzIiPjQ8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5EZWZpbml0aW9uIG9mIHRoZQorSW50ZXJuYWwgRm9yd2FyZCBMb2NrIEZpbGUgRm9ybWF0PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lOwordGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjExPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MyPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48c3BhbiBzdHlsZT0nZm9udC12YXJpYW50Om5vcm1hbCAhaW1wb3J0YW50OwordGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzMyI+NC4xPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToKKzEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LWRlY29yYXRpb246Citub25lJz6goKCgoKCgIDwvc3Bhbj5LZXkgRGVyaXZhdGlvbjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uLiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTE8L3NwYW4+PC9hPjwvc3Bhbj48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MyPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48c3BhbiBzdHlsZT0nZm9udC12YXJpYW50Om5vcm1hbCAhaW1wb3J0YW50OwordGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzNCI+NC4yPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToKKzEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LWRlY29yYXRpb246Citub25lJz6goKCgoKCgIDwvc3Bhbj5DYWxjdWxhdGlvbiBvZiB0aGUgQ291bnRlcnM8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTI8L3NwYW4+PC9hPjwvc3Bhbj48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzNSI+NTxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPlVuaXQgVGVzdCBDYXNlczxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjEyPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQzNiI+NjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPlJlZmVyZW5jZXM8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+PC9wPgorCis8L2Rpdj4KKworPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOnJpZ2h0Jz4KKzwvc3Bhbj4KKworPGRpdiBjbGFzcz1Xb3JkU2VjdGlvbjI+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDIyIj48L2E+PGEgbmFtZT0iX1JlZjI2MzA4NTQ3NCI+MTxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5JbnRyb2R1Y3Rpb248L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlIGZvcm1hdCBpcyB1c2VkIGZvciBlbmNyeXB0aW5nCitpbmhlcmVudGx5IHVuZW5jcnlwdGVkIE9NQSBEUk0gdmVyc2lvbiAxIEZvcndhcmQgTG9jayBhbmQgQ29tYmluZWQgRGVsaXZlcnkKK2ZpbGVzIHNvIHRoZXkgY2FuIGJlIHNlY3VyZWx5IHN0b3JlZCBvbiBleHRlcm5hbGx5IGFjY2Vzc2libGUgZmlsZSBzeXN0ZW0gcGFydGl0aW9ucworc3VjaCBhcyBtZW1vcnkgc3RpY2suPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5PdXIgZ2VuZXJhbCBzdHJhdGVneSBpcyB0byBjb252ZXJ0IHN1Y2ggPGk+T01BIERSTSBNZXNzYWdlPC9pPgorKJEuZG2SKSBmaWxlcyB0byBpbnRlcm5hbCBGb3J3YXJkIExvY2sgKJEuZmySKSBmaWxlcyBhcyBzb29uIGFzIHRoZXkgYXJlCitkb3dubG9hZGVkIG9yIG90aGVyd2lzZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGhvbmUsIGFuZCBub3QgYWN0dWFsbHkgcHJvdmlkZSBhbnkKK2RlY29kZXJzIGZvciCRLmRtkiBmaWxlcy48L3A+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDIzIj4yPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPk92ZXJ2aWV3PC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSA8aT5Gb3J3YXJkIExvY2sgQ29udmVydGVyPC9pPiBjb252ZXJ0cyBPTUEgRFJNIE1lc3NhZ2UKK2ZpbGVzIHRvIHRoZSBpbnRlcm5hbCBmaWxlIGZvcm1hdC4gVGhlIDxpPkZvcndhcmQgTG9jayBEZWNvZGVyPC9pPiBwcm92aWRlcyBhCitQT1NJWC1sZXZlbCBBUEkgZm9yIHRyYW5zcGFyZW50IHJlYWRpbmcgYW5kIHNlZWtpbmcgdGhyb3VnaCBzdWNoIGEgY29udmVydGVkCitmaWxlIGFzIGlmIGl0IHdlcmUgdW5lbmNyeXB0ZWQuIFRoZSBBUEkgYWxzbyBpbmNsdWRlcyBmdW5jdGlvbnMgZm9yIGNoZWNraW5nIGEKK2ZpbGWScyBpbnRlZ3JpdHkgYW5kIGdldHRpbmcgdGhlIE1JTUUgdHlwZSBvZiBpdHMgZW1iZWRkZWQgY29udGVudC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+VGhlIGNvbnZlcnRlciBhbmQgZGVjb2RlciBhcmUKK2J1aWx0IGludG8gdHdvIHNlcGFyYXRlIGxpYnJhcmllcywgd2hpY2ggc2hhcmUgY29tbW9uIGNvZGUgZm9yIHJhbmRvbSBudW1iZXIKK2dlbmVyYXRpb24gYW5kIGtleSBlbmNyeXB0aW9uIGluIGEgdGhpcmQgbGlicmFyeS4gRm9yIHRlc3QgcHVycG9zZXMgdGhlcmUgaXMKK2Fsc28gYSB1bml0IHRlc3QgYXBwbGljYXRpb24uIFNlZSBGaWd1cmUgMS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTI4OCBoZWlnaHQ9MzY0CitzcmM9ImltYWdlcy9pbWFnZTAwMS5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDoxMi4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MjczMDg4NSI+RmlndXJlIDwvYT4xLiBCbG9jayBkaWFncmFtIGlsbHVzdHJhdGluZyB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIGV4ZWN1dGFibGUgbW9kdWxlcy48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTYuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDI0Ij4zPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPlVzZSBDYXNlczwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGFsbCB0aGUgdXNlIGNhc2VzIGZvciB0aGUgY29udmVydGVyCithbmQgZGVjb2Rlci4gSXQgc2hvd3MgdGhlIHNlcXVlbmNlIG9mIEFQSSBjYWxscyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHNvbHZlCit0aGVzZSB1c2UgY2FzZXMuPC9wPgorCis8aDI+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNSI+My4xPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkNvbnZlcnRlcjwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaHJvdWdoIHRoZSBjb252ZXJ0ZXIgQVBJLCBjb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25lCitvZiB0d28gd2F5czo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PGk+UHVzaC1tb2RlCitjb252ZXJzaW9uPC9pPiBpcyB3aGVuIHRoZSBjbGllbnQgcHJvZ3Jlc3NpdmVseSBmZWVkcyBkYXRhIHRvIHRoZSBjb252ZXJ0ZXIgYXMKK2l0IGFycml2ZXMuIFRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiBkYXRhIGFycml2ZXMgZ3JhZHVhbGx5IGluIGNodW5rcywgd2l0aAoraWRsZSB0aW1lIGluIGJldHdlZW4uIENvbnNlcXVlbnRseSwgcHVzaCBtb2RlIGlzIHVzZWQgZm9yIGNvbnZlcnRpbmcgZmlsZXMKK2JlaW5nIGRvd25sb2FkZWQgdGhyb3VnaCBIVFRQLiBTZWUgc2VjdGlvbiAzLjEuMS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PGk+UHVsbC1tb2RlCitjb252ZXJzaW9uPC9pPiBpcyB3aGVuIHRoZSBjb252ZXJ0ZXIgZHJpdmVzIHRoZSBwcm9jZXNzIGFuZCBjb25zdW1lcyBkYXRhIGZyb20KK3RoZSBjbGllbnQgYXMgaXQgbmVlZHMgaXQuIFRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiB0aGUgZW50aXJlIGZpbGUgdG8gYmUKK2NvbnZlcnRlZCBpcyByZWFkaWx5IGF2YWlsYWJsZS4gSGVuY2UsIHB1bGwgbW9kZSBpcyB1c2VkIGJ5IHRoZSB1bml0IHRlc3QgYXBwbGljYXRpb24uCitTZWUgc2VjdGlvbiAzLjEuMi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkludGVybmFsbHksIHB1bGwtbW9kZSBjb252ZXJzaW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zCitvZiB0aGUgQVBJIGZvciBwdXNoLW1vZGUgY29udmVyc2lvbi48L3A+CisKKzxoMz48YSBuYW1lPSJfVG9jMjc2NDcxNDI2Ij48L2E+PGEgbmFtZT0iX1JlZjI2MzA4NTQ3OCI+My4xLjE8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Q29udmVydCBEYXRhCisoUHVzaC1Nb2RlIENvbnZlcnNpb24pPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlB1c2gtbW9kZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhcyBmb2xsb3dzIChzZWUgYWxzbyBGaWd1cmUgMik6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0NvbnZfT3BlblNlc3Npb248L3NwYW4+Citpbml0aWFsaXplcyB0aGUgb3V0cHV0IHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIDxpPnNlc3Npb24gSUQ8L2k+IHRvIGJlIHVzZWQgaW4KK3N1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIEFQSS4gVGhlIG91dHB1dCBwYXJhbWV0ZXIgaXMgYSB1bmlvbiBvZiByZXR1cm4gdmFsdWVzCit3aG9zZSBjb3JyZWN0IHVzZSBhdCBhbnkgZ2l2ZW4gbW9tZW50IGlzIGRldGVybWluZWQgYnkgdGhlIEFQSSBmdW5jdGlvbiBsYXN0CitjYWxsZWQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0NvbnZfQ29udmVydERhdGE8L3NwYW4+CitpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCBubyBtb3JlIGlucHV0IGRhdGEgcmVtYWlucy4gRWFjaCBjYWxsIGNvbnZlcnRzIHRoZQorbWF4aW11bSBhbW91bnQgb2YgZGF0YSBwb3NzaWJsZSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGUgY2xpZW50IHRoZW4KK3dyaXRlcyB0aGlzIGRhdGEgdG8gZmlsZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+My48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrQ29udl9DbG9zZVNlc3Npb248L3NwYW4+CitjbGVhbnMgdXAgdGhlIHNlc3Npb24gYW5kIGRlYWxsb2NhdGVzIHRoZSBvdXRwdXQgYnVmZmVyLiBJZiBhbGwgaGFzIGdvbmUgd2VsbCwgYQordHdvLXBhcnQgY3J5cHRvZ3JhcGhpYyBzaWduYXR1cmUgb2YgdGhlIG91dHB1dCBmaWxlIGlzIGNhbGN1bGF0ZWQuIFRoZSBjbGllbnQKK211c3QgZ28gYmFjayBhbmQgcmV3cml0ZSBwYXJ0IG9mIHRoZSBmaWxlIGhlYWRlciB3aXRoIHRoaXMgdXBkYXRlZCBzaWduYXR1cmUKK2luZm9ybWF0aW9uLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+RXZlcnkgdGltZSBhIGZpbGUgaXMgYmVpbmcgY29udmVydGVkLCB0aGUgY29udmVydGVyIGNhbGxzIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyPC9zcGFuPgordG8gZ2VuZXJhdGUgYSBuZXcsIHVuaXF1ZSBzZXNzaW9uIGtleS4gTm8gdHdvIGNvbnZlcnRlZCBmaWxlcyBsb29rIGFsaWtlLCBldmVuCitpZiB0aGUgb3JpZ2luYWwgZmlsZXMgYXJlIHRoZSBzYW1lLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+PGI+Tm90ZTo8L2I+IFRoZSByYW5kb20gYnl0ZXMgY2Fubm90IGNvbWUgZnJvbSBhbnkgYmFyZS1taW5pbXVtCitpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQy1saWJyYXJ5IDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5yYW5kPC9zcGFuPgorZnVuY3Rpb26XdGhleSBtdXN0IGJlIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZS4gT3RoZXJ3aXNlLCBzZWN1cml0eSB3aWxsIGJlCitjb21wcm9taXNlZC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBzZXNzaW9uIGtleSBpcyBlbmNyeXB0ZWQgYW5kIHN0b3JlZCB3aXRoaW4gdGhlCitjb252ZXJ0ZWQgZmlsZS4gS2V5IGVuY3J5cHRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfRW5jcnlwdEtleTwvc3Bhbj4uCitUaGVzZSB0d28gZnVuY3Rpb25zLCB0b2dldGhlciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRlY3J5cHRpb24gZnVuY3Rpb24gKDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfRGVjcnlwdEtleTwvc3Bhbj4pLAorYXJlIHRoZSBpbnRlZ3JhdGlvbiBwb2ludHMgd2hlcmUgYW4gT0VNIG1hbnVmYWN0dXJlciBtYXkgaW1wbGVtZW50IHRoZWlyIG93bgora2V5LWVuY3J5cHRpb24gc2NoZW1lLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+PGI+Tm90ZTo8L2I+IFRoZSBrZXktZW5jcnlwdGlvbiBrZXkgbXVzdCBiZSB1bmlxdWUgdG8gZWFjaAorZGV2aWNlOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhlIGZpbGVzIGZvcndhcmQgbG9ja5Zwcm90ZWN0ZWQuIElkZWFsbHksIGl0IHNob3VsZAorYmUgZGVyaXZlZCBmcm9tIHNlY3JldCBoYXJkd2FyZSBwYXJhbWV0ZXJzLCBidXQgYXQgdGhlIHZlcnkgbGVhc3QgaXQgc2hvdWxkIGJlCitwZXJzaXN0ZW50IGZyb20gb25lIG1hc3RlciByZXNldCB0byB0aGUgbmV4dC48L3A+CisKKzxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O3BhZGRpbmc6MS4wcHQgNC4wcHQgMS4wcHQgNC4wcHQ7CitiYWNrZ3JvdW5kOiNGMkYyRjInPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nYmFja2dyb3VuZDojRjJGMkYyO2JvcmRlcjoKK25vbmU7cGFkZGluZzowY20nPjxiPk5vdGU6PC9iPiBJbiB0aGUgb3Blbi1zb3VyY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+bGliZndkbG9jay1jb21tb248L3NwYW4+CitsaWJyYXJ5LCBhIHJhbmRvbSBrZXktZW5jcnlwdGlvbiBrZXkgaXMgZ2VuZXJhdGVkIGFuZCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluCit0aGUgZmlsZSBzeXN0ZW0sIHdpdGhvdXQgYmVpbmcgb2JmdXNjYXRlZCBpbiBhbnkgd2F5IChkb2luZyBzbyB3b3VsZCBiZSBmdXRpbGUKK3NpbmNlIHRoZSBzb3VyY2UgY29kZSBpcyBvcGVubHkgYXZhaWxhYmxlKS4gVGhpcyBrZXkgbXVzdCBiZSBrZXB0IHNlY3JldCBmcm9tCit0aGUgdXNlciwgYW5kIHNob3VsZG6SdCBiZSBwb3NzaWJsZSB0byBleHRyYWN0IHRocm91Z2ggYmFja3VwLWFuZC1yZXN0b3JlCitmdW5jdGlvbmFsaXR5IG9yIHRoZSBsaWtlLiBPRU0gbWFudWZhY3R1cmVycyB3aWxsIHByb2JhYmx5IHdhbnQgdG8gaW1wbGVtZW50IGEKK3RydWx5IGhhcmR3YXJlLWJhc2VkIGRldmljZS11bmlxdWUga2V5LjwvcD4KKworPC9kaXY+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTUzMSBoZWlnaHQ9NTYzCitzcmM9ImltYWdlcy9pbWFnZTAwMi5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMDg1MTg3Ij5GaWd1cmUgPC9hPjIuIENvbnZlcnRlciBVQzogQ29udmVydCBEYXRhLjwvcD4KKworPGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMy4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvYj4KKworPGgzPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjciPjwvYT48YSBuYW1lPSJfUmVmMjYzMTYzMDgyIj4zLjEuMjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5Db252ZXJ0IEZpbGUKKyhQdWxsLU1vZGUgQ29udmVyc2lvbik8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+UHVsbC1tb2RlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGJ5IGNhbGxpbmcgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0RmlsZTwvc3Bhbj4KK3dpdGggdGhlIGZpbGVuYW1lLCB1bmxlc3MgdGhlcmUgaXMgbmVlZCBmb3IgYSBzcGVjaWFsaXplZCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPnJlYWQ8L3NwYW4+IGZ1bmN0aW9uLCBpbgord2hpY2ggY2FzZSA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ29udmVydE9wZW5GaWxlPC9zcGFuPgorc2hvdWxkIGJlIHVzZWQgZGlyZWN0bHkgaW5zdGVhZC4gU2VlIEZpZ3VyZSAzLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz5JbnRlcm5hbGx5LCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NvbnZlcnRGaWxlPC9zcGFuPgorY2FsbHMgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NvbnZlcnRPcGVuRmlsZTwvc3Bhbj4uCitUaGUgbGF0dGVyIHRoZW4gcHJvY2VlZHMgd2l0aCB0aGUgY29udmVyc2lvbiB1c2luZyB0aGUgcHVzaC1tb2RlIEFQSSwgYWN0aW5nIGFzCit0aGUgY2xpZW50IGluIHRoZSBwcmV2aW91cyB1c2UgY2FzZTsgc2VlIHNlY3Rpb24gMy4xLjEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01MzEgaGVpZ2h0PTczMQorc3JjPSJpbWFnZXMvaW1hZ2UwMDMuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzA4NTIwOCI+RmlndXJlIDwvYT4zLiBDb252ZXJ0ZXIgVUM6IENvbnZlcnQgRmlsZS48L3A+CisKKzxiPjxpPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTQuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2k+PC9iPgorCis8aDI+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyOCI+My4yPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkRlY29kZXI8L2E+PC9oMj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGRlY29kZXIgQVBJIGFsbG93cyB0aGUgY2xpZW50IHRvIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNoZWNrCit0aGUgaW50ZWdyaXR5IG9mIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLCBpLmUuLCBkZXRlY3Qgd2hldGhlciBpdCBoYXMKK2JlZW4gbWFuaXB1bGF0ZWQgaW4gYW55IHdheTsgc2VlIHNlY3Rpb24gMy4yLjEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkdldAordGhlIE1JTUUgdHlwZSBvZiB0aGUgZW1iZWRkZWQgY29udGVudCAodGhlIJNvcmlnaW5hbJQgTUlNRSB0eXBlIGJlZm9yZSBEUk0gcHJvdGVjdGlvbgord2FzIGFwcGxpZWQpOyBzZWUgc2VjdGlvbiAzLjIuMi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+My48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+RGVjb2RlCit0aGUgZmlsZSBieSByYW5kb20gYWNjZXNzLCBpLmUuLCByZWFkIGFuZCBzZWVrIHRocm91Z2ggaXQgaW4gYW4gYXJiaXRyYXJ5CittYW5uZXI7IHNlZSBzZWN0aW9uIDMuMi4zLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+QWxsIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyBvbiBhIGZpbGUgZmlyc3QgcmVxdWlyZSBpdCB0byBiZQorb3BlbmVkLiBPcGVuaW5nIGEgZmlsZSByZXR1cm5zIGEgPGk+ZmlsZSBkZXNjcmlwdG9yPC9pPpdhIGhhbmRsZSB0byBiZSB1c2VkIGluCit0aGVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JZiB0aGUgZmlsZW5hbWUgaXMga25vd24sIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlCitjYW4gYmUgb3BlbmVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPi4KK0lmIG9ubHkgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBhbHJlYWR5IG9wZW4gZmlsZSBpcyBhdmFpbGFibGUsIGEgZGVjb2RpbmcKK3Nlc3Npb24gY2FuIGluc3RlYWQgYmUgaW5pdGlhbGl6ZWQgdXNpbmcgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkludGVybmFsbHksIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OgorIkx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+IGNhbGxzIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4uIEZvciBlZmZpY2llbmN5CityZWFzb25zLCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPgordGhlcmVmb3JlIGFzc3VtZXMgdGhhdCB0aGUgZmlsZSBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHdoZW4KK3RoZSBmdW5jdGlvbiBnZXRzIGNhbGxlZC4gQSBjbGllbnQgd2hvIGNhbGxzIGl0IGRpcmVjdGx5IG11c3QgbWFrZSBzdXJlIHRoYXQKK3RoaXMgYXNzdW1wdGlvbiBob2xkcy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PldoZW4gYSBmaWxlIGlzIGJlaW5nIGF0dGFjaGVkLCB0aGUgc2Vzc2lvbiBrZXkgc3RvcmVkIGluCit0aGUgZmlsZSBkdXJpbmcgY29udmVyc2lvbiBpcyBkZWNyeXB0ZWQgdXNpbmcgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoPC9zcGFuPiBhbmQgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9EZWNyeXB0S2V5PC9zcGFuPiwKK2luIG9yZGVyIHRvIHNldCB1cCBmb3IgZGVjb2RpbmcgYW5kIGludGVncml0eSBjaGVja2luZy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkZvciBqdXN0IGdldHRpbmcgdGhlIGNvbnRlbnQgdHlwZSwgaG93ZXZlciwgcmV0cmlldmluZyB0aGUKK3Nlc3Npb24ga2V5IHdvdWxkIHN0cmljdGx5IHNwZWFraW5nIG5vdCBiZSBuZWNlc3NhcnksIHNvIHRoZXJlIGlzIGFuCitvcHBvcnR1bml0eSBoZXJlIHRvIG9wdGltaXplIGZvciB0aGF0IGlmIGl0IHByb3ZlcyBuZWNlc3NhcnkgbGF0ZXIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5TeW1tZXRyaWNhbCB0byA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToKKyJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPiBhbmQgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPiwgdGhlcmUgYXJlIGFsc28gZnVuY3Rpb25zCitmb3IgY2xvc2luZyBhIGZpbGUgb3IgZGV0YWNoaW5nIGZyb20gaXQ6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPklmCitpdCB3YXMgb3BlbmVkIHdpdGggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+CitpdCBzaG91bGQgYmUgY2xvc2VkIHdpdGggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2Nsb3NlPC9zcGFuPi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+SWYKK2l0IHdhcyBhdHRhY2hlZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+CitpdCBzaG91bGQgYmUgZGV0YWNoZWQgd2l0aCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfZGV0YWNoPC9zcGFuPi48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTMuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMz48YSBuYW1lPSJfUmVmMjYzMTYzMDk5Ij48L2E+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyOSI+My4yLjE8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Q2hlY2sgSW50ZWdyaXR5PC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZXJlIGFyZSB0aHJlZSBtZXRob2RzIGZvciBjaGVja2luZyB0aGUgaW50ZWdyaXR5IG9mIGFuCitpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSwgaW4gd2hvbGUgb3IgaW4gcGFydCAoc2VlIGFsc28gRmlndXJlIDQpOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NoZWNrRGF0YUludGVncml0eTwvc3Bhbj4sCit3aGljaCBjaGVja3MgdGhlIGludGVncml0eSBvZiB0aGUgZW5jcnlwdGVkIGNvbnRlbnQgZGF0YS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eTwvc3Bhbj4sCit3aGljaCBjaGVja3MgdGhlIGludGVncml0eSBvZiB0aGUgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyB0aGUgY29udGVudCB0eXBlIGFuZAorb3RoZXIgZmllbGRzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ1dCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+My48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0ludGVncml0eTwvc3Bhbj4sCit3aGljaCBpbnRlcm5hbGx5IGNhbGxzIGZpcnN0IDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eTwvc3Bhbj4KK2FuZCB0aGVuIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHk8L3NwYW4+LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eTwvc3Bhbj4gaXMKK2dlbmVyYWxseSBtdWNoIGZhc3RlciB0aGFuIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHk8L3NwYW4+LAord2hvc2UgcnVubmluZyB0aW1lIGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgZmlsZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTU0MyBoZWlnaHQ9NTc1CitzcmM9ImltYWdlcy9pbWFnZTAwNC5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMTYzMzA4Ij5GaWd1cmUgPC9hPjQuIERlY29kZXIgVUM6IENoZWNrIEludGVncml0eS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTMuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMz48YSBuYW1lPSJfVG9jMjc2NDcxNDMwIj48L2E+PGEgbmFtZT0iX1JlZjI2MzE2MzExNyI+My4yLjI8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+R2V0IENvbnRlbnQgVHlwZTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlPC9zcGFuPiByZXR1cm5zIGEKK3JlYWQtb25seSByZWZlcmVuY2UgdG8gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIE1JTUUgdHlwZSBvZiB0aGUKK2VtYmVkZGVkIGNvbnRlbnQuIFRoaXMgcmVmZXJlbmNlIGlzIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGZpbGUgaXMga2VwdCBvcGVuLgorQ2xpZW50cyB3aG8gbmVlZCBhY2Nlc3MgdG8gdGhlIGNvbnRlbnQgdHlwZSBhZnRlciBjbG9zaW5nIHRoZSBmaWxlIHNob3VsZCBtYWtlCithIGNvcHkgb2YgdGhlIHN0cmluZy4gU2VlIEZpZ3VyZSA1IGJlbG93LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTQzIGhlaWdodD00ODgKK3NyYz0iaW1hZ2VzL2ltYWdlMDA1LmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMxNjMzOTIiPkZpZ3VyZSA8L2E+NS4gRGVjb2RlciBVQzogR2V0IENvbnRlbnQgVHlwZS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTMuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMz48YSBuYW1lPSJfVG9jMjc2NDcxNDMxIj48L2E+PGEgbmFtZT0iX1JlZjI2MzE2MzEzNyI+My4yLjM8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+RGVjb2RlIEZpbGU8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+QWZ0ZXIgb3BlbmluZyBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSAob3IgYXR0YWNoaW5nCit0byBhbiBhbHJlYWR5IG9wZW4gb25lKSwgaXQgY2FuIGJlIHRyYW5zcGFyZW50bHkgcmVhZCBmcm9tIGFzIGlmIGl0IHdlcmUKK3VuZW5jcnlwdGVkLiBBbnkgbnVtYmVyIG9mIGNhbGxzIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gb3IKK3NldCBpdCB0byBhIG5ldyBvbmUgKHdoaWNoIGlzIHdoYXQgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6CisiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+bHNlZWs8L3NwYW4+IGRvZXMpIGNhbiBiZSBtYWRlIGluIGFueSBvcmRlcjsgdGhpcyBpcyB3aGF0IHdlCitjYWxsIDxpPnJhbmRvbSBhY2Nlc3M8L2k+LiBTZWUgRmlndXJlIDYuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgRm9yd2FyZCBMb2NrIERlY29kZXIgdmVyc2lvbnMgb2YgdGhlIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+cmVhZDwvc3Bhbj4sIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+bHNlZWs8L3NwYW4+LCBhbmQgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5jbG9zZTwvc3Bhbj4gZnVuY3Rpb25zCitoYXZlIHRoZSBleGFjdCBzYW1lIHNpZ25hdHVyZXMgYXMgdGhlaXIgUE9TSVggY291bnRlcnBhcnRzLiBTbywgZm9yIGV4YW1wbGUsCit0aGUgY2FsbCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfbHNlZWsoZmQsCiswLCBTRUVLX0VORCk8L3NwYW4+IHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGVtYmVkZGVkIGNvbnRlbnQgZGF0YSwgaS5lLiwgdGhlCitzaXplIG9mIHRoZSBvcmlnaW5hbCBmaWxlIGJlZm9yZSBEUk0gcHJvdGVjdGlvbi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+TW9yZW92ZXIsIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4KK2lzIGxpa2UgcmVndWxhciBQT1NJWCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+b3Blbjwvc3Bhbj4KK2V4Y2VwdCBpdCB0YWtlcyBvbmx5IHRoZSBmaWxlbmFtZSBhcyBhIHBhcmFtZXRlcpdhY2Nlc3MgaXMgYWx3YXlzIHJlYWQtb25seS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTU0MyBoZWlnaHQ9NTIyCitzcmM9ImltYWdlcy9pbWFnZTAwNi5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMTY2MzAzIj5GaWd1cmUgPC9hPjYuIERlY29kZXIgVUM6IERlY29kZSBGaWxlLjwvcD4KKworPGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNi4wcHQ7Zm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTphbHdheXMnPgorPC9zcGFuPjwvYj4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzIiPjQ8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+RGVmaW5pdGlvbiBvZiB0aGUgSW50ZXJuYWwgRm9yd2FyZCBMb2NrIEZpbGUgRm9ybWF0PC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjEyLjBwdCc+VGhlIGlubmVyIHN0cnVjdHVyZSBvZiBhbiBpbnRlcm5hbAorRm9yd2FyZCBMb2NrIGZpbGUgaXMgZGVmaW5lZCBpbiBUYWJsZSAxIGJlbG93LjwvcD4KKworPHRhYmxlIGNsYXNzPU1zb05vcm1hbFRhYmxlIGJvcmRlcj0xIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MAorIHN0eWxlPSdib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyOm5vbmUnPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGI+T2Zmc2V0IFtieXRlc108L2I+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItbGVmdDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGI+U2l6ZSBbYnl0ZXNdPC9iPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLWxlZnQ6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPkRlc2NyaXB0aW9uPC9iPjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjA8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz40PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VGhlIGZpbGUgc2lnbmF0dXJlIChzby1jYWxsZWQKKyAgPGk+bWFnaWMgbnVtYmVyPC9pPik6IGEgZm91ci1jaGFyYWN0ZXIgY29kZSBjb25zaXN0aW5nIG9mIHRoZSBsZXR0ZXJzCisgIEYtVy1MLUsuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjE8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5WZXJzaW9uIG51bWJlciAoMCBmb3IgdGhlCisgIGZpcnN0IHZlcnNpb24pLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjU8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SW5kaWNhdGVzIHRoZSBzdWJmb3JtYXQ6PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDAgRm9yd2FyZCBMb2NrPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAxIENvbWJpbmVkIERlbGl2ZXJ5PC9pPjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjY8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VXNhZ2UgcmVzdHJpY3Rpb24gZmxhZ3MgKHByb2hpYml0aW9ucworICBhZ2FpbnN0IHVzYWdlIGFzIHJpbmd0b25lIG9yIGFzIHdhbGxwYXBlciBhbmQgc2NyZWVuIHNhdmVyKS4gQWxzbyBpbmRpY2F0ZXMKKyAgaWYgdGhlIGZpbGUgaXMgYm91bmQgdG8gYSBzcGVjaWZpYyBTSU0gY2FyZC48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMCBObyB1c2FnZQorICByZXN0cmljdGlvbnM8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDEgUmluZ3RvbmUgdXNhZ2UKKyAgcHJvaGliaXRlZDwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMiBTY3JlZW4gdXNhZ2UKKyAgcHJvaGliaXRlZDwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHg4MCBCb3VuZCB0byBTSU08L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPihBbnkgbnVtYmVyIG9mIHRoZXNlIG1heSBiZQorICBPUi1lZCB0b2dldGhlci4pPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NzwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjE8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5MZW5ndGggb2YgdGhlIE1JTUUgY29udGVudAorICB0eXBlICg8aT5rPC9pPikuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+ODwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPms8L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VGhlIE1JTUUgY29udGVudCB0eXBlCisgIChBU0NJSS1lbmNvZGVkIHdpdGhvdXQgbnVsbC1jaGFyYWN0ZXIgdGVybWluYXRpb24pLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjgrPGk+azwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT5sIDwvaT49IDAgb3IgMTY8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5JZiB0aGUgc3ViZm9ybWF0IGlzCisgIENvbWJpbmVkIERlbGl2ZXJ5LCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBhdXRvLWdlbmVyYXRlZCBjb250ZW50IElEICgxNiZuYnNwO2J5dGVzKS4KKyAgSWYgbm90LCB0aGlzIGZpZWxkIGlzIHplcm8tc2l6ZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+KzxpPmw8L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bSA8L2k+PSAwIG9yIDk8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5JZiB0aGUgZmlsZSBpcyBib3VuZCB0byBhCisgIHNwZWNpZmljIFNJTSBjYXJkLCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSA5LWJ5dGUgcGFja2VkIElNU0kgbnVtYmVyLiBJZiBub3QsCisgIHRoaXMgZmllbGQgaXMgemVyby1zaXplLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjgrPGk+azwvaT4rPGk+bDwvaT4rPGk+bTwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT5uPC9pPiAmIzg4MDU7IDE2PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSwgdGhlCisgIGZpcnN0IHNpeHRlZW4gYnl0ZXMgb2Ygd2hpY2ggYXJlIGFsc28gdXNlZCBhcyB0aGUgQ1RSLW1vZGUgPGk+bm9uY2U8L2k+IChzaW1pbGFyCisgIHRvIHRoZSBDQkMtbW9kZSA8aT5pbml0aWFsaXphdGlvbiB2ZWN0b3I8L2k+KS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+KzxpPmw8L2k+KzxpPm08L2k+KzxpPm48L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MjA8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5EYXRhIHNpZ25hdHVyZZd0aGUgU0hBLTEKKyAgSE1BQyBvZiB0aGUgZW5jcnlwdGVkIGNvbnRlbnQgZGF0YS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4yOCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjIwPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SGVhZGVyIHNpZ25hdHVyZZd0aGUgU0hBLTEKKyAgSE1BQyBvZiBhbGwgdGhlIGZpZWxkcyBhYm92ZSwgaW5jbHVkaW5nIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgYW5kIGRhdGEKKyAgc2lnbmF0dXJlLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjQ4KzxpPms8L2k+KzxpPmw8L2k+KzxpPm08L2k+KzxpPm48L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+Jmx0O3RvIHRoZSBlbmQgb2YgdGhlCisgIGZpbGUmZ3Q7PC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBjb250ZW50IGRhdGEgZW5jcnlwdGVkCisgIHVzaW5nIDEyOC1iaXQgQUVTIGluIENUUiBtb2RlLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorPC90YWJsZT4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtO3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxhIG5hbWU9Il9SZWYxNTEyNjkyMDYiPlRhYmxlIDwvYT4xLiBEZWZpbml0aW9uIG9mIHRoZSBmaWVsZHMgb2YgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5BcyBvZiBub3csIG5laXRoZXIgQ29tYmluZWQgRGVsaXZlcnkgbm9yIHVzYWdlCityZXN0cmljdGlvbnMgKGluY2x1ZGluZyBTSU0gYmluZGluZykgYXJlIHN1cHBvcnRlZC4gVGhlc2UgZmllbGRzIGFyZSByZXNlcnZlZAorZm9yIGZ1dHVyZSB1c2UuPC9wPgorCis8aDI+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMyI+NC4xPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPktleSBEZXJpdmF0aW9uPC9hPjwvaDI+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBzZXNzaW9uIGtleSBjb25zaXN0cyBvZiBzaXh0ZWVuIGJ5dGVzIGZldGNoZWQgZnJvbSBhCitjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuIEZyb20gdGhlIHNlc3Npb24ga2V5LCB0d28KK3NlcGFyYXRlIGtleXMgYXJlIGRlcml2ZWQ6IG9uZSB1c2VkIGZvciBlbmNyeXB0aW9uLCB0aGUgb3RoZXIgZm9yIHNpZ25pbmcuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgZW5jcnlwdGlvbiBrZXkgaXMgdGhlIG91dHB1dCBmcm9tIGVuY3J5cHRpbmcgdGhlCisxNi1ieXRlIGFsbC16ZXJvIGlucHV0IGJsb2NrIHswLCAwLCCFLCAwfSB1c2luZyAxMjgtYml0IEFFUyB3aXRoIHRoZSByYW5kb20gc2Vzc2lvbgora2V5IGFzIHRoZSBrZXkuIFRoZSBzaWduaW5nIGtleSBpcyB0aGUgb3V0cHV0IGZyb20gZW5jcnlwdGluZyB0aGUgMTYtYnl0ZSBpbnB1dAorYmxvY2sgezEsIDAsIIUsIDB9IHRoZSBzYW1lIHdheS4gVGhlIGtleXMgc28gZGVyaXZlZCB3aWxsIGJlIGNyeXB0b2dyYXBoaWNhbGx5CitpbmRlcGVuZGVudCBmcm9tIGVhY2ggb3RoZXIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgaXMgZW5jcnlwdGVkIHVzaW5nIGEgaGFyZHdhcmUtZGVwZW5kZW50CitrZXktZW5jcnlwdGlvbiBrZXkgdW5pcXVlIHRvIGVhY2ggZGV2aWNlLiBUaGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGlzIHN0b3JlZAoraW5zaWRlIHRoZSBmaWxlLCBhbmQgaXRzIGZpcnN0IHNpeHRlZW4gYnl0ZXMgYXJlIGFsc28gdXNlZCBhcyB0aGUgPGk+bm9uY2U8L2k+Citmb3IgdGhlIENUUi1tb2RlIGVuY3J5cHRpb24gb2YgdGhlIGNvbnRlbnQgZGF0YS48L3A+CisKKzxoMj48YSBuYW1lPSJfVG9jMjc2NDcxNDM0Ij40LjI8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+Q2FsY3VsYXRpb24gb2YgdGhlIENvdW50ZXJzPC9hPjwvaDI+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlVzaW5nIENUUiAok2NvdW50ZXKUKSBtb2RlLCBhIGJsb2NrIGNpcGhlciBzdWNoIGFzIEFFUyBjYW4KK2JlIHR1cm5lZCBpbnRvIGEgc3RyZWFtIGNpcGhlci4gVGhlIHByb2Nlc3Mgb2YgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBpcword2VsbCBkZWZpbmVkIGluIFsxXSwgZXhjZXB0IGZvciB0aGUgc3BlY2lmaWNzIG9mIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUKK2NvdW50ZXJzLiBGb3IgdGhlIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlIGZvcm1hdCwgdGhlIGNvdW50ZXJzIGFyZQorY2FsY3VsYXRlZCBhcyBmb2xsb3dzOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5UaGUKK25vbmNlIGlzIGludGVycHJldGVkIGFzIGEgMTI4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5UaGUKK3plcm8tYmFzZWQgYmxvY2sgc2VxdWVuY2UgbnVtYmVyIChhbHNvIGEgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyKSBpcworYWRkZWQgbW9kdWxvIDI8c3VwPjEyODwvc3VwPiB0byB0aGUgbm9uY2UgdG8gcHJvZHVjZSB0aGUgY291bnRlciBmb3IgYSBnaXZlbgorYmxvY2suPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNSI+NTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Vbml0IFRlc3QgQ2FzZXM8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VW5pdCB0ZXN0IGNhc2VzIGZvciB0aGUgY29udmVydGVyIGFuZCBkZWNvZGVyIGNvbWUgaW4gdHdvCit2YXJpZXRpZXM6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPkJsYWNrLWJveDwvaT4KK3Rlc3QgY2FzZXMgYWltIHRvIHZlcmlmeSB0aGF0IHlvdSBnZXQgc2Vuc2libGUgcmVzdWx0cyBmcm9tIG1hbGZvcm1lZCBvcgork3RyaWNreZQgaW5wdXQgZGF0YS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PGk+V2hpdGUtYm94PC9pPgordGVzdCBjYXNlcyBhaW0gdG8gbWF4aW1pemUgY29kZSBjb3ZlcmFnZSB1c2luZyBrbm93bGVkZ2Ugb2YgY29kZSBpbnRlcm5hbHMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgYmxhY2stYm94IHRlc3QgY2FzZXMgYXJlIGRlcGVuZGVudCBvbiBhIHNwZWNpZmljYWxseQorZGVzaWduZWQgc2V0IG9mIGlucHV0IGZpbGVzIGZvdW5kIGluIHRoZSA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L3Rlc3QvcmVzPC9zcGFuPgorZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5LiBGb3IgkXRlc3RzkiB2YXJpYW50cyBvZiB0aGUgc29mdHdhcmUsIHRoZXNlIGlucHV0CitmaWxlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGluIHRoZSBmaWxlIHN5c3RlbSBpbWFnZSBkdXJpbmcgYnVpbGQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5SdW4gdGhlIHRlc3QgY2FzZXMgZnJvbSB0aGUgQURCIHNoZWxsIGNvbW1hbmQgbGluZSBhcworZm9sbG93czo8L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLXRvcDowY207bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOjYuMHB0OworbWFyZ2luLWxlZnQ6MjEuNTVwdCc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPiMKK2d0ZXN0X2Z3ZGxvY2s8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JZiBhbGwgYmxhY2stYm94IGJ1dCBubyB3aGl0ZS1ib3ggdGVzdCBjYXNlcyBmYWlsLCB0aGUKK2lucHV0IGZpbGVzIHByb2JhYmx5IGNhbpJ0IGJlIGZvdW5kIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS48L3A+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDM2Ij42PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPlJlZmVyZW5jZXM8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjI4LjlwdDt0ZXh0LWluZGVudDotMjguOXB0Jz5bMV08c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPjxhCitocmVmPSJodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvbmlzdHB1YnMvODAwLTM4YS9zcDgwMC0zOGEucGRmIj5Ed29ya2luLAorTW9ycmlzOiCTUmVjb21tZW5kYXRpb24gZm9yIEJsb2NrIENpcGhlciBNb2RlcyBvZiBPcGVyYXRpb26XTWV0aG9kcyBhbmQKK1RlY2huaXF1ZXMslCBOSVNUIFNwZWNpYWwgUHVibGljYXRpb24gODAwLTM4QSwgRGVjZW1iZXIgMjAwMS48L2E+PGEKK25hbWU9Il9SZWYxNTEyNjkwNzMiPjwvYT48L3A+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDEuZ2lmIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5NDUxMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDIuZ2lmIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxMmY0NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDMuZ2lmIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMTljYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDQuZ2lmIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlMWQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDUuZ2lmIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4N2JlOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDYuZ2lmIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL2ltYWdlcy9pbWFnZTAwNi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0NWI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaCBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaAppbmRleCBlNmJhM2M0Li4wODVlYmYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCkBAIC00OSw2ICs0OSw5IEBACiAgICAgY2xhc3MgT25JbmZvTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UgewogCiAgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PbkluZm9MaXN0ZW5lcigpIHt9CisKKyAgICBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCkgPSAwOwogICAgIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWMyMDgxMS4uMjI1M2ViMiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI1LDcgKzI1LDggQEAKICAgICA8YXBwbGljYXRpb24+ICAgIAogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJNZWRpYUZyYW1ld29ya1Rlc3QiPiAgICAgICAgIAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTWVkaWFGcmFtZXdvcmtUZXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249ImxhbmRzY2FwZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvQWNjb3VudFVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9BY2NvdW50VW5sb2NrU2NyZWVuLmphdmEKaW5kZXggODQwYzVlMS4uYzRmZWVmZCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9BY2NvdW50VW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9BY2NvdW50VW5sb2NrU2NyZWVuLmphdmEKQEAgLTYyLDggKzYyLDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBS0VfUE9LRV9NSUxMSVMgPSAzMDAwMDsKIAotICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOworICAgIHByaXZhdGUgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOwogICAgIHByaXZhdGUgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVG9wSGVhZGVyOwpAQCAtMTU5LDcgKzE1OSwxMCBAQAogICAgICAgICBpZiAobUNoZWNraW5nRGlhbG9nICE9IG51bGwpIHsKICAgICAgICAgICAgIG1DaGVja2luZ0RpYWxvZy5oaWRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVtb3ZlQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1VcGRhdGVNb25pdG9yLnJlbW92ZUNhbGxiYWNrKHRoaXMpOyAvLyB0aGlzIG11c3QgYmUgZmlyc3QKKyAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMgPSBudWxsOworICAgICAgICBtVXBkYXRlTW9uaXRvciA9IG51bGw7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggMzJjMDE2ZC4uZWRhYjY5MCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTIyOSw4ICsyMjksOCBAQAogICAgICAgICAgICAgICAgIG1LZXlndWFyZEhvc3QucG9zdERlbGF5ZWQobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEtleWd1YXJkVmlld01hbmFnZXIudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZEhvc3QucmVtb3ZlVmlldyhsYXN0Vmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZpZXcuY2xlYW5VcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZEhvc3QucmVtb3ZlVmlldyhsYXN0Vmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9LCA1MDApOwpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IDgyMmJlNDYuLjg4NmI4NWYgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKQEAgLTQ5NSw4ICs0OTUsMTAgQEAKICAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkgewogICAgICAgICAoKEtleWd1YXJkU2NyZWVuKSBtTG9ja1NjcmVlbikub25QYXVzZSgpOwogICAgICAgICAoKEtleWd1YXJkU2NyZWVuKSBtTG9ja1NjcmVlbikuY2xlYW5VcCgpOworICAgICAgICB0aGlzLnJlbW92ZVZpZXcobUxvY2tTY3JlZW4pOwogICAgICAgICAoKEtleWd1YXJkU2NyZWVuKSBtVW5sb2NrU2NyZWVuKS5vblBhdXNlKCk7CiAgICAgICAgICgoS2V5Z3VhcmRTY3JlZW4pIG1VbmxvY2tTY3JlZW4pLmNsZWFuVXAoKTsKKyAgICAgICAgdGhpcy5yZW1vdmVWaWV3KG1VbmxvY2tTY3JlZW4pOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlY3VyZSgpIHsKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKaW5kZXggMWI4MTBkNS4uMmJjNTdiNSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEKQEAgLTU5LDkgKzU5LDkgQEAKIAogICAgIHByaXZhdGUgU3RhdHVzIG1TdGF0dXMgPSBTdGF0dXMuTm9ybWFsOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOwotICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwotICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOworICAgIHByaXZhdGUgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOworICAgIHByaXZhdGUgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKICAgICBwcml2YXRlIFNsaWRpbmdUYWIgbVNsaWRpbmdUYWI7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtU2NyZWVuTG9ja2VkOwpAQCAtNjU5LDcgKzY1OSwxMCBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotICAgICAgICBtVXBkYXRlTW9uaXRvci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVtb3ZlQ2FsbGJhY2sodGhpcyk7IC8vIHRoaXMgbXVzdCBiZSBmaXJzdAorICAgICAgICBtTG9ja1BhdHRlcm5VdGlscyA9IG51bGw7CisgICAgICAgIG1VcGRhdGVNb25pdG9yID0gbnVsbDsKKyAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQppbmRleCA2ODE1ZDUwLi42YzZjMmNjOCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKQEAgLTYyLDkgKzYyLDkgQEAKICAgICBwcml2YXRlIGludCBtVG90YWxGYWlsZWRQYXR0ZXJuQXR0ZW1wdHMgPSAwOwogICAgIHByaXZhdGUgQ291bnREb3duVGltZXIgbUNvdW50ZG93blRpbWVyID0gbnVsbDsKIAotICAgIHByaXZhdGUgZmluYWwgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKLSAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtVXBkYXRlTW9uaXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKKyAgICBwcml2YXRlIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtVXBkYXRlTW9uaXRvcjsKKyAgICBwcml2YXRlIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgbUNhbGxiYWNrOwogCiAgICAgLyoqCiAgICAgICogd2hldGhlciB0aGVyZSBpcyBhIGZhbGxiYWNrIG9wdGlvbiBhdmFpbGFibGUgd2hlbiB0aGUgcGF0dGVybiBpcyBmb3Jnb3R0ZW4uCkBAIC0zNjIsNiArMzYyLDkgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CiAgICAgICAgIG1VcGRhdGVNb25pdG9yLnJlbW92ZUNhbGxiYWNrKHRoaXMpOworICAgICAgICBtTG9ja1BhdHRlcm5VdGlscyA9IG51bGw7CisgICAgICAgIG1VcGRhdGVNb25pdG9yID0gbnVsbDsKKyAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUK